【问题标题】:Lazily coalesce Options in ScalaScala中的延迟合并选项
【发布时间】:2014-02-18 01:14:37
【问题描述】:
我有几种计算值的方法,按偏好递减。
firstWay()
second() + way()
orA(thirdWay())
每个都返回一个Option。我想“合并”这些并获得一个Option,其中的第一个Some返回的值,或者None如果全部返回None。
当然,如果firstWay() 返回Some,我不应该计算其余部分。
什么是最惯用(或至少合理可读)的方式来做到这一点?
【问题讨论】:
标签:
scala
lazy-evaluation
scala-option
coalescing
【解决方案1】:
firstWay().orElse(second() + way()).orElse(orA(thirdWay()))
orElse 的参数是惰性求值的。
见the documentation。
【解决方案2】:
如果你有足够多的方式让 Karol 的答案变得笨拙,或者事先不知道有多少:
val options: Stream[Option[A]] = ...
// in the example: firstWay() #:: (second() + way()) #:: orA(thirdWay())
options.foldLeft[Option[A]](None)(_.orElse(_))