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
如果我有 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