我非常熟悉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*
有没有这样的,或者最好的方法是什么?
提前致谢!
答案 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