迭代Option实例,直到找到第一个非空

rom*_*oll 2 functional-programming scala

我有许多返回Option值的函数,就像这样

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())
Run Code Online (Sandbox Code Playgroud)

我想要做的是,我想按顺序运行这些函数,但只有在其中一个函数返回Option带有值(a Some)的函数之前.然后我希望返回该值,而不运行其余的函数.

这是我目前的实施

val res:Option[Any] = Stream(
  () => optionA(),
  () => optionB(),
  () => optionC()
) .map(f => f())
  .filter(opt => opt.isDefined)
  .head
Run Code Online (Sandbox Code Playgroud)

对于上述功能的实现,适用optionAoptionB,给了我一个Some(B()),而且也从未运行optionC,这是我想要的.

但我想知道是否有更好/简单/替代的实施.

有点像val findFirst = optionA compose optionB compose optionC

Did*_*ont 7

optionA().orElse(optionB()).orElse(optionC())
Run Code Online (Sandbox Code Playgroud)

orElse如果this定义,将不会评估其参数.

或者,如果您已经在集合/流中有选项,那么您可能会这样做

options.find(_.isDefined).flatten
Run Code Online (Sandbox Code Playgroud)