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)
对于上述功能的实现,适用optionA和optionB,给了我一个Some(B()),而且也从未运行optionC,这是我想要的.
但我想知道是否有更好/简单/替代的实施.
有点像val findFirst = optionA compose optionB compose optionC?
optionA().orElse(optionB()).orElse(optionC())
Run Code Online (Sandbox Code Playgroud)
orElse如果this定义,将不会评估其参数.
或者,如果您已经在集合/流中有选项,那么您可能会这样做
options.find(_.isDefined).flatten
Run Code Online (Sandbox Code Playgroud)