对于orElse而不是flatMap的Scala for-comprehension

时间:2014-05-15 21:26:29

标签: scala for-comprehension

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

所以我知道你可以做点什么

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

如果for for merehension中没有任何内容Some(z),则会向我None,因为它在每个语句上执行flatMap

但实际上我正在寻找其他方面的东西。我希望遍历for理解,因为一切都是None,就像orElse理解中的for一样。

例如:

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

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

提前致谢!

2 个答案:

答案 0 :(得分:7)

reduce在找到Some时不会短路(即即使第一个元素是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

答案 1 :(得分: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