以惯用方式处理Scala选项

时间:2014-01-30 21:11:57

标签: scala scala-option

处理Optionmap / getOrElsematch的惯用方法是什么?

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 个答案:

答案 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

中提取它