Lazily在Scala中合并选项

时间:2014-02-18 01:14:37

标签: scala lazy-evaluation scala-option coalescing

我有几种计算价值的方法,优先级递减。

firstWay()
second() + way()
orA(thirdWay())

每个都返回Option。我希望“合并”这些并获得Option,其中Some返回的值为None,如果全部返回None则为firstWay()

当然,如果Some返回{{1}},我就不应该计算其余部分。

最常用的(或至少是合理可读的)方法是什么?

2 个答案:

答案 0 :(得分:11)

firstWay().orElse(second() + way()).orElse(orA(thirdWay()))

orElse的论点被懒惰地评估了。

请参阅the documentation

答案 1 :(得分:1)

如果你有足够的方式让卡罗尔的答案变得笨拙,或者事先不知道多少:

val options: Stream[Option[A]] = ...
// in the example: firstWay() #:: (second() + way()) #:: orA(thirdWay())

options.foldLeft[Option[A]](None)(_.orElse(_))