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

标签 scala functional-programming

我有许多函数返回 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

对于上面的函数实现,这适用于 optionAoptionB , 给我一个 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/

相关文章:

Scala:使用稍后创建的实例初始化字段

scala - 为什么相同的 Scala 代码在命令行中可以正常工作,而在 Intellij 中却不行?

haskell - 将带有break-s/continue-s的命令式控制流转换为haskell

javascript - ngrx处理对象中的嵌套数组

python - 递归闭包(函数发生器)

scala - 使用Spark/Scala从HDFS读取CSV

java - py4j 中的 scala 类型转换是如何完成的?

java - 在列表上映射通用方法并生成结果列表

javascript - 这个循环的函数式替换是什么?

inheritance - Scala中是否有一个“SELF”类型代表当前类型?