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

pic*_*ter 4 scala for-comprehension

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

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

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

Some(z)如果在理解中没有任何内容None,那就给了我,因为它flatMap在每个语句中都做了.

但实际上我正在寻找其他方面的东西.我想穿越到for理解,只要一切None,就像是orElsefor理解.

例如:

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

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

提前致谢!

小智 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
Run Code Online (Sandbox Code Playgroud)