我正在尝试使用模式匹配在Scala中找到列表的最后一个元素。我尝试了以下代码
def last[A](list: List[A]):A = list match {
case head :: Nil => head
case head :: tail => last(tail)
case _ => Nil
}
最后一种情况,即case _ => Nil
由于类型不匹配而引发错误(发现Nil.type需要A)我知道可以使用其他方法解决此问题,但是仅使用模式匹配是否可以解决此问题?
由于列表属于通用类型,因此我无法将
Nil
替换为只能在运行时确定的类型A的默认值。删除这一行:
case _ => Nil
显然可以正常工作,但是警告说如果使用Nil参数,它将失败。那么,在这种情况下如何处理Nil参数呢?
最佳答案
使用Option[T]
返回结果,因此,如果存在某些元素,则返回Some(lastElement)
,否则返回Option.empty
例子,
def last[A](list: List[A]): Option[A] = list match {
case head :: Nil => Option(head)
case head :: tail => last(tail)
case _ => Option.empty
}
it("returns last element") {
assert(last(List("apple")) == Some("apple"))
assert(last(List("apple", "mango")) == Some("mango"))
assert(last(List()) == Option.empty)
assert(last(List()) == None)
}
如何访问
Option[T]
? last(List("In absentia", "deadwind")) match {
case Some(lastValue) => println(s"Yayy there was lastValue = ${lastValue}") //prints Yayy there was lastValue = deadwind
case None => println("Oops list was empty")
}
last(List()) match {
case Some(lastValue) => println(s"Yayy there was lastValue = ${lastValue}")
case None => println("Oops list was empty") //prints Oops list was empty
}
// or using map
last(List("In absentia", "deadwind")).map(lastValue => print(s"lastValue is ${lastValue}"))