如何在 map 函数中处理 Scala 中的条件逻辑?
How to handle conditional logic in Scala within the map function?
我得到了一小段 Scala 代码,我想对其进行优化以使其更具功能性。
我得到了以下内容
val foo: Option[Double]
val bar: Map[String, Double]
以及一个采用 Option[Map[String, Double]]
的方法
所以在我的业务逻辑中,我尝试确定是否定义了 foo
。如果是,我必须将 None
传递给该方法,因为 foo
和 bar
不能同时存在。
我目前的处理方式如下
val newOptionalMap = if (foo.isDefined) {
None
} else {
Some(bar)
}
myFunction(newOptionalMap)
我想把它变成一个更实用的方法。我试过
val newOptionalMap = foo.map(_ => bar)
但这是失败的,因为它从未真正将 bar
定义为 None
,因此我的方法失败了,因为它不期望 foo
和 bar
同时定义。
我可以采用哪种函数式方法来简化条件逻辑?
有两种方法可以解决您的问题。
如@jwvh 所述,您可以轻松使用 fold
:
val newOptionalMap = foo.fold(Option(bar))(_ => None))
另一种方法是使用模式匹配:
val newOptionalMap = foo match {
case Some(_) => None
case _ => Some(bar)
}
Here 有关于折叠或模式匹配用法的讨论,
我得到了一小段 Scala 代码,我想对其进行优化以使其更具功能性。
我得到了以下内容
val foo: Option[Double]
val bar: Map[String, Double]
以及一个采用 Option[Map[String, Double]]
所以在我的业务逻辑中,我尝试确定是否定义了 foo
。如果是,我必须将 None
传递给该方法,因为 foo
和 bar
不能同时存在。
我目前的处理方式如下
val newOptionalMap = if (foo.isDefined) {
None
} else {
Some(bar)
}
myFunction(newOptionalMap)
我想把它变成一个更实用的方法。我试过
val newOptionalMap = foo.map(_ => bar)
但这是失败的,因为它从未真正将 bar
定义为 None
,因此我的方法失败了,因为它不期望 foo
和 bar
同时定义。
我可以采用哪种函数式方法来简化条件逻辑?
有两种方法可以解决您的问题。
如@jwvh 所述,您可以轻松使用 fold
:
val newOptionalMap = foo.fold(Option(bar))(_ => None))
另一种方法是使用模式匹配:
val newOptionalMap = foo match {
case Some(_) => None
case _ => Some(bar)
}
Here 有关于折叠或模式匹配用法的讨论,