处理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
}
答案 0 :(得分:9)
您可以随时查看Scaladoc for Option:
使用scala.Option实例的最惯用方法是将其视为集合或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.Option值的一种不那么惯用的方法是通过模式匹配:
val nameMaybe = request getParameter "name"
nameMaybe match {
case Some(name) =>
println(name.trim.toUppercase)
case None =>
println("No name value")
}
答案 1 :(得分:4)
将fold
用于此类地图或其他默认设置:
val x = option.fold(0.5){ value => Math.cos(value) + Math.sin(value) }
答案 2 :(得分:1)
显然两者都是有效的,我不认为一个比另一个更惯用。话虽这么说,使用map使用Option是Monad的事实。当组合两个选项时,这可能特别有利。假设您有两个要添加的Option [Int]。在这种情况下,不是进行多次匹配,使用map / flatMap就更清晰了,而且对于理解来说它是等同的"。因此,对于您的示例,两者都是有效的......但是对于使用map / flatMap的其他示例,通常更为简洁。
Some(6).flatMap(intValue => Some(5).map(intValue + _))
或
for {
i <- Some(6)
j <- Some(5)
} yield i + j
答案 3 :(得分:0)
它们都有不同的语义,所以在你的情况下都没有。
map
将一些函数应用于Option
内的值,如果它存在(Some
,而不是None
)。基本上这就是你安全地使用Options
的方法,在某些null
值上应用函数是dangeroues,因为它可以抛出NPE,但是在Option的情况下它只返回None。
getOrElse
只返回它的值或默认值(你提供的参数)。它不会对Option
中的值执行任何操作,如果您有Some
,则可以将其解压缩,如果为无,则可以返回默认值。
和match
方法我认为是两者的组合,因为您可以对值应用一些计算并从Option