4

我对for理解和flatMap选项非常熟悉。

所以我知道你可以做类似的事情

val a: Option[_] = for {
  foo <- Some(x)
  bar <- Some(y)
  baz <- Some(z)
} yield baz

Some(z)如果 for 理解中没有任何内容,这给了我is None,因为它对flatMap每个语句都执行 a 。

但实际上我正在寻找相反的东西。我想遍历for理解,只要一切都是None,就像orElse一个for理解。

例如:

val b: Option[_] = for {
    foo <- None
    bar <- Some(x)
    baz <- None
} yield *return the one with some*

有没有这样的事情,或者最好的方法是什么?

提前致谢!

4

2 回答 2

7

reduce当它找到 a 时不会短路Some(即,即使第一个元素是 a ,一千个元素列表也会进行一千次比较Some)。find(_.isDefined)+flatten将停止并返回Some它找到的第一个。以下只会进行 2 次比较(而不是 5 次)。

val xs: List[Option[Int]] = List(None, Some(1), None, Some(2), None, Some(3))
xs.find(_.isDefined).flatten
于 2014-05-16T02:55:55.537 回答
3

在您的场景中,理解并没有真正意义。您最好将这些项目放在一个集合中并取出一个非无。

也许是这样的?

val xs: List[Option[Int]] = List(None, Some(1), None)
xs.reduce(_ orElse _) // Some(1)

val ys: List[Option[Int]] = List(None, None)
ys.reduce(_ orElse _) // None
于 2014-05-15T21:29:23.583 回答