如果值是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()
}

09-28 05:36