我有许多函数返回 Option
值(value)观,像这样
case class A()
case class B()
case class C()
def optionA(): Option[A] = None
def optionB(): Option[B] = Some(B())
def optionC(): Option[C] = Some(C())
我想要做的是,我想按顺序运行这些函数,但直到其中一个函数返回
Option
具有值 (a Some
)。然后我想返回该值,而不运行其余函数。这是我目前的实现
val res:Option[Any] = Stream(
() => optionA(),
() => optionB(),
() => optionC()
) .map(f => f())
.filter(opt => opt.isDefined)
.head
对于上面的函数实现,这适用于
optionA
和 optionB
, 给我一个 Some(B())
,它从不运行 optionC
,这就是我想要的。但我想知道是否有更好/简单/替代的实现。
类似
val findFirst = optionA compose optionB compose optionC
?
最佳答案
optionA().orElse(optionB()).orElse(optionC())
orElse
如果 this
,则不会评估其参数被定义为。或者,如果您已经在集合/流中拥有选项,您可能会这样做
options.find(_.isDefined).flatten
关于scala - 迭代 Option 实例,直到找到第一个非空实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057559/