Scala 折叠评估函数 ifEmpty 而不是表达式

Scala fold evaluate function ifEmpty instead of expression

如果我有 Option:

val o = someFuncReturningOption()

我选择 fold:

o.fold(valIfEmpty){(_, i) => println(i) }

是否有 fold 的变体或另一个采用函数而不是 ifEmpty 的值的函数,以便仅在(在这种情况下)Option为空,而不是取值?

编辑ifEmpty 函数接受参数。

查看输出 (scala 2.11):

scala> def func = { println("Evaluate if empty"); (3,4)}
func: (Int, Int)

scala> val opt = Option((4,5))
opt: Option[(Int, Int)] = Some((4,5))

scala> opt.fold(func)( x => x)
res7: (Int, Int) = (4,5)

scala> opt.getOrElse(func)
res8: (Int, Int) = (4,5)

scala> val none:Option[(Int,Int)] = None 
none: Option[(Int, Int)] = None

scala> none.getOrElse(func)
Evaluate if empty
res9: (Int, Int) = (3,4)

scala> none.fold(func)(x => x)
Evaluate if empty
res10: (Int, Int) = (3,4)

仅当 Option 为 None

时才会调用 func

编辑 如果 ifEmpty 采用参数,则行为相同:

scala> def funcWithArguments(default:(Int,Int)) = { println("Evaluate if empty"); default}
funcWithArguments: (default: (Int, Int))(Int, Int)

scala> opt.getOrElse(func((2,4)))
res4: (Int, Int) = (4,5)

scala>  none.getOrElse(func((2,4)))
Evaluate if empty
res5: (Int, Int) = (2,4)

查看方法 getOrElse 的签名:

final def getOrElse[B >: A](default: ⇒ B): B

表达式仅在调用时计算(当 Option 为空时)

如果需要转换结果类型,使用map的构造:

scala> none.map(a => a._2).getOrElse({println("ifEmpty");8})
ifEmpty
res13: Int = 8

scala> opt.map(a => a._2).getOrElse({println("ifEmpty");8})
res14: Int = 5