我正在尝试使用模式匹配在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}"))

10-07 19:01
查看更多