惯用Scala:根据条件映射选项

Rah*_*thy 4 scala

我有两个val,一个condition和一个option.请注意,这condition是一个简单的布尔值,不依赖于选项的值.

如果condition成立,我想映射选项以将其转换为结果值.在所有其他情况下,我想返回一个defaultResult.

这有效并且非常易读,但我不喜欢重复defaultResult:

val result = if (condition) {
  option.map(valueToResult).getOrElse(defaultResult)
} else {
  defaultResult
}
Run Code Online (Sandbox Code Playgroud)

我的第二种方法没有重复,但我不喜欢过滤器被滥用于实际上并不依赖于选项值的事实:

val result = option.filter(_ => condition).map(valueToResult).getOrElse(defaultResult)
Run Code Online (Sandbox Code Playgroud)

在Scala中有什么更惯用或更好的方法?

Yuv*_*kov 9

你可以使用Option.collect:

如果此选项为非空且为该值定义,则返回scala.Some包含应用于pfscala.Option包含值的结果的a pf.

val result = option.collect {
  case x if condition => valueToResult(x)
}.getOrElse(defaultResult)
Run Code Online (Sandbox Code Playgroud)

  • @YuvalItzchakov 为什么不只做 `option match {}` 而不是 `option.collect {}` ? (2认同)