折叠选项列表以查找第一个或最后一个

Tre*_*vor 7 scala folding

我正在尝试折叠选项列表,以便返回第一个(或最后一个)某些值或如果没有任何某些值则返回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列表是否为空.


Deb*_*ski 9

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)

会更好.