8

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
}
4

4 回答 4

11

你总是可以只看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")
}
于 2014-01-30T23:33:20.697 回答
4

用于fold这种 map-or-else-default 事物:

val x = option.fold(0.5){ value => Math.cos(value) + Math.sin(value) }
于 2014-01-30T21:19:35.700 回答
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
于 2014-01-30T21:25:42.097 回答
0

它们都有不同的语义,所以在你的情况下它们都没有。

map将某些函数应用于 内部的值Option,如果它存在(Some,不None)。基本上这就是你安全使用的Options方法,在某些null值上应用函数是危险的,因为它可能会抛出 NPE,但如果使用 Option,它只会返回 None。

getOrElse只需返回它的值或默认值(您作为参数提供)。它不会对 中的值做任何事情Option,如果你有,你可以提取它,Some或者返回一个默认值,如果是 None。

我想说的match方法是两者的结合,因为您可以对值应用一些计算并从Option

于 2014-01-30T21:20:03.047 回答