如果值是Some(...),则产生副作用的最惯用的方法是什么;如果值是None,则是另一种副作用的最惯用的方法。这是我目前倾向于写的内容:
def doSideEffectA(value: Int) {
// ...
}
def doSideEffectB() {
// ...
}
def doSideEffect(valueOption: Option[Int]) {
valueOption map { value =>
doSideEffectA(value)
} getOrElse {
doSideEffectB()
}
}
我的问题是,如果valueOption为None时我不必执行任何操作,则是这样写的:
def doSideEffectNothingIfNone(valueOption: Option[Int]) {
valueOption foreach { value =>
doSideEffectA(value)
}
}
map/getOrElse通常不在副作用上下文中使用,而foreach则使用。我对valueOption map {...} getOrElse {...}返回Unit不太满意,因为我实际上从我的Option [Int]中没有“得到”任何东西。
最佳答案
Kim Stebel所说的:模式匹配是一个简单的解决方案。
valueOption match {
case Some(value) => doSideEffectA(value)
case None => doSideEffectB()
}