处理Option
、map
/getOrElse
或match
的更常用的方法是什么?
val x = option map {
value => Math.cos(value) + Math.sin(value)
} getOrElse {
.5
}
或
val x = option match {
case Some(value) => Math.cos(value) + Math.sin(value)
case None => .5
}
您可以随时查看选项的Scaladoc:
使用scala的最常用方法。选项实例是将其视为集合或monad,并使用map、flatMap、filter或foreach:
val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")
稍后:
使用scala的不太习惯的方法。选项值通过模式匹配:
val nameMaybe = request getParameter "name"
nameMaybe match {
case Some(name) =>
println(name.trim.toUppercase)
case None =>
println("No name value")
}
对于这种地图或其他默认的东西使用fold
:
val x = option.fold(0.5){ value => Math.cos(value) + Math.sin(value) }
显然两者都是有效的,我不认为其中一个比另一个更惯用。话虽如此,使用地图使用的是Option是Monad的事实。当组合两个选项时,这可能特别有利。假设你有两个你想添加的选项[Int]。在这种情况下,与其进行多次匹配,不如使用map/flatMap,它相当于"用于理解"。所以对于你的例子来说,两者都是有效的。。。但对于其他示例,使用map/flatMap通常要简洁得多。
Some(6).flatMap(intValue => Some(5).map(intValue + _))
或
for {
i <- Some(6)
j <- Some(5)
} yield i + j
所有这些都有不同的语义,所以在您的情况下,它们都没有。
如果Option
中的值存在(Some
,而不是None
),则map
将某些函数应用于该值。基本上,这就是安全使用Options
的方法,在某些null
值上应用函数是危险的,因为它可以抛出NPE,但在使用Option的情况下,它只返回None。
getOrElse
只是简单地返回它的值或默认值(作为参数提供)。它不会对Option
中的值执行任何操作,如果您有Some
,您可以提取它,或者在None的情况下返回默认值。
我认为match
方法是两者的结合,因为你可以对这些值进行一些计算,并从Option
中提取出来