加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 模式匹配以查找列表的最后一个元素

发布时间:2020-12-16 18:27:29 所属栏目:安全 来源:网络整理
导读:我试图使用模式匹配找到 scala中列表的最后一个元素.我试过以下代码 def last[A](list: List[A]):A = list match { case head :: Nil = head case head :: tail = last(tail) case _ = Nil } 最后一种情况,即case _ = Nil因类型不匹配而抛出错误(发现Nil.typ
我试图使用模式匹配找到 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)

我知道这个问题可以使用其他方法解决,但只使用模式匹配是否有办法解决这个问题?

因为列表是泛型类型所以我不能用类型A的默认值替换Nil,它只能在运行时确定.

删除此行: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}"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读