我正在尝试折叠选项列表,以便返回第一个(或最后一个)某些值或如果没有任何某些值则返回None.
scala> val opts = List(None, Some(1), None, Some(2), None)
opts: List[Option[Int]] = List(None, Some(1), None, Some(2), None)
scala> opts foldLeft(None)((a,io) => a match { case None => io; case Some(i) =>
a})
<console>:9: error: object None does not take parameters
opts foldLeft(None)((a,io) => a match { case None => io; case Some
(i) => a})
^
Run Code Online (Sandbox Code Playgroud)
不知道我做错了什么.也许有一种方法可以使用更高阶函数更简单地做到这一点,但这里没有任何东西引起了我的注意.
ten*_*shi 14
也许这可以解决你的问题 - 第一个元素:
opts.flatten.headOption
Run Code Online (Sandbox Code Playgroud)
最后一个要素:
opts.flatten.lastOption
Run Code Online (Sandbox Code Playgroud)
flatten方法将取消Option列表列表中的所有None值并删除所有值.headOption/ lastOption将返回Some列表中的第一个/最后一个元素,或者None列表是否为空.
tenshi的答案非常简单,但对于长列表,它会尝试压扁所有内容,因为它不是懒惰的.(我想view在这里也不会帮助我们,但我不太确定.)
在这种情况下,您可以使用:
opts.dropWhile(_.isEmpty).headOption.flatMap(identity)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我们不能flatten在这里使用,因为这将返回通用Iterable[Int]而不是Option,所以我们必须选择更长的成语flatMap(identity).
编辑:正如戴夫注意到的:
opts.find(_.isDefined).flatMap(identity)
Run Code Online (Sandbox Code Playgroud)
会更好.