如果我有Option
:
val o = someFuncReturningOption()
我选择fold
:
o.fold(valIfEmpty){(_, i) => println(i) }
是否存在fold
或另一个函数的变体,它接受函数而不是ifEmpty
的值,以便仅在(在本例中)Option
为{是空的,而不是取值?
编辑:ifEmpty
函数接受参数。
答案 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