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
}
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 的 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")
}
用于fold
这种 map-or-else-default 事物:
val x = option.fold(0.5){ value => Math.cos(value) + Math.sin(value) }
显然两者都是有效的,我认为没有一个比另一个更惯用。话虽如此,使用 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
它们都有不同的语义,所以在你的情况下它们都没有。
map
将某些函数应用于 内部的值Option
,如果它存在(Some
,不None
)。基本上这就是你安全使用的Options
方法,在某些null
值上应用函数是危险的,因为它可能会抛出 NPE,但如果使用 Option,它只会返回 None。
getOrElse
只需返回它的值或默认值(您作为参数提供)。它不会对 中的值做任何事情Option
,如果你有,你可以提取它,Some
或者返回一个默认值,如果是 None。
我想说的match
方法是两者的结合,因为您可以对值应用一些计算并从Option