习惯地处理Scala选项



处理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
}

您可以随时查看选项的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中提取出来

最新更新