7

我有几种计算价值的方法,以降低偏好。

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

这些中的每一个都返回一个Option. 我想“合并”这些并获取Option其中第一个返回的值Some,或者None如果全部返回None

当然,如果firstWay()返回 a Some,我不应该计算其余部分。

什么是最惯用(或至少合理可读)的方式来做到这一点?

4

2 回答 2

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

orElse的论点被懒惰地评估。

请参阅文档

于 2014-02-18T01:40:20.533 回答
1

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

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

options.foldLeft[Option[A]](None)(_.orElse(_))
于 2014-02-18T10:12:19.447 回答