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

惯用Scala:根据条件映射选项,scala,Scala,我有两个vals,一个条件和一个选项。请注意,条件是一个简单的布尔值,不取决于选项的值 如果condition为true,我想映射该选项以将其转换为结果值。在所有其他情况下,我希望返回一个defaultResult 这是可行的,可读性很强,但我不喜欢重复defaultResult: val result = if (condition) { option.map(valueToResult).getOrElse(defaultResult) } else { defaultResult

我有两个
val
s,一个
条件
和一个
选项
。请注意,
条件
是一个简单的布尔值,不取决于选项的值

如果
condition
为true,我想映射该选项以将其转换为结果值。在所有其他情况下,我希望返回一个
defaultResult

这是可行的,可读性很强,但我不喜欢重复
defaultResult

val result = if (condition) {
  option.map(valueToResult).getOrElse(defaultResult)
} else {
  defaultResult
}
我的第二种方法没有重复,但我不喜欢过滤器被滥用,因为它实际上并不依赖于期权的价值:

val result = option.filter(_ => condition).map(valueToResult).getOrElse(defaultResult)
在Scala中,哪种方法更惯用或更好?

您可以使用:

val result = (condition match {
  case true => option.map(valueToResult)
  case false => None
}).getOrElse(defaultResult)
返回一个
scala.Some
,其中包含将
pf
应用到此
scala.Option
包含的值,如果此选项为非空且
pf
为空 为该值定义


val result=(对于)(vWhy您觉得
过滤器
被滥用了?因为它是基于外部值进行过滤的,与
选项[t]
的基础值无关?没有规定“使用
过滤器
仅过滤基础
选项[t]
的属性”我会选择第二种。没错。我知道没有规则,这只是个人(dis)品味。我明白你的意思。我有时也会有这种感觉。看看我的答案,寻找可能的替代解决方案。旁白是关于
布尔值
-。@YuvalItzchakov为什么不干脆做
选项匹配{}
而不是
option.collect{}
?@SarveshKumarSingh,因为她想根据外部条件应用过滤器。这只是一种方法。
选项匹配实际上也很好。我将其作为一个答案发布,仅供参考。
val result = option.collect {
  case x if condition => valueToResult(x)
}.getOrElse(defaultResult)
val result = (for (v<-option if condition) yield valueToResult(v)).getOrElse(defaultResult)
option.foldLeft(defaultResult)((d,x) => if (condition) valueToResult(x) else d)
val result = option match {
  case Some(value) if condition => valueToResult(value)
  case _ => defaultResult
}