我非常熟悉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