Scala for-comprehension for orElse instead of flatMap



我非常熟悉for理解和flatMap on Options。

我知道你可以这样写

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

如果for理解中没有None,则给出Some(z),因为它在每个语句上执行flatMap

但实际上我在寻找另一种方式。我想遍历到for推导式,只要一切都是None,就像for推导式中的orElse

例如:

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

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

提前感谢!

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

for-comprehension在您的场景中没有真正的意义。你最好把项目放在一个集合中,然后取出一个非none。

也许是这样的?

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

最新更新