scala更好的map getOrElse语法

pba*_*ris 14 scala

有没有更好的方法来编写下面的代码?

val t = map.get('type).getOrElse(""); 
if (t != "") "prefix" + t;
Run Code Online (Sandbox Code Playgroud)

对内联代码感兴趣

val t = map.get('type).getOrElse("").????
Run Code Online (Sandbox Code Playgroud)

Tra*_*own 33

Map有自己的getOrElse方法,所以你可以写下面的内容:

val t = map.getOrElse('type, "")
Run Code Online (Sandbox Code Playgroud)

这与t第一个例子中的定义完成相同的事情.


解决您的注释:如果您知道您的地图永远不会将空字符串作为值包含,您可以使用以下内容添加"prefix":

map.get('type).map("prefix" + _).getOrElse("")
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是Scala 2.10:

map.get('type).fold("")("prefix" + _)
Run Code Online (Sandbox Code Playgroud)

如果您的地图可以包含""值,则此版本的行为与您的版本略有不同,因为它会为这些值添加前缀.如果您想要在单行中与您的版本完全相同的行为,您可以编写以下内容:

map.get('type).filter(_.nonEmpty).map("prefix" + _).getOrElse("")
Run Code Online (Sandbox Code Playgroud)

这可能不是必需的,但听起来你不希望你的地图中有空字符串.


Dav*_*ith 5

还值得注意的是,在某些情况下,您可以.getOrElse用一次.withDefaultValue调用替换多个常见用法。

val map = complexMapCalculation().withDefaultValue("")

val t = map('type)
Run Code Online (Sandbox Code Playgroud)

我不会说这是每次都应该做的事情,但它可以很方便。