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

时间:2015-05-20 20:26:55

标签: scala optional fold

如果我有Option

val o = someFuncReturningOption()

我选择fold

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

是否存在fold或另一个函数的变体,它接受函数而不是ifEmpty的值,以便仅在(在本例中)Option为{是空的,而不是取值?

编辑ifEmpty函数接受参数。

1 个答案:

答案 0 :(得分:4)

参见输出(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