在Scala中执行map/getOrElse返回Unit的惯用方法是什么?

Oli*_*hez 7 functional-programming scala

如果值为Some(...),则执行副作用的最常用方法是什么?如果值为None,则执行另一个副作用.这是我目前倾向于写的内容:

def doSideEffectA(value: Int) {
  // ...
}

def doSideEffectB() {
  // ...
}

def doSideEffect(valueOption: Option[Int]) {
  valueOption map { value =>
    doSideEffectA(value)
  } getOrElse {
    doSideEffectB()
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我没有做任何事情,如果valueOption是None,那么这就是我写的:

def doSideEffectNothingIfNone(valueOption: Option[Int]) {
  valueOption foreach { value =>
    doSideEffectA(value)
  }
}
Run Code Online (Sandbox Code Playgroud)

map/getOrElse通常不用于副作用上下文,而foreach是.我对valueOption map {...} getOrElse {...}返回Unit感到不舒服,因为我没有从我的Option [Int]中"得到"任何东西.

pr1*_*001 13

Kim Stebel说:模式匹配是一个简单的解决方案.

valueOption match {
  case Some(value) => doSideEffectA(value)
  case None => doSideEffectB()
}
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 9

Scala 2.10包含一种fold方法Option,适用于您需要两者NoneSome解析为相同类型(包括Unit)的任何情况:

scala> Option("salmon").fold(println("No fish")){f => println(s"I like $f")}
I like salmon
Run Code Online (Sandbox Code Playgroud)