19

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

val t = map.get('type).getOrElse(""); 
if (t != "") "prefix" + t;

对内联代码感兴趣

val t = map.get('type).getOrElse("").????
4

5 回答 5

39

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

val t = map.getOrElse('type, "")

t它完成了与第一个示例中的定义相同的事情。


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

map.get('type).map("prefix" + _).getOrElse("")

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

map.get('type).fold("")("prefix" + _)

如果您的地图可以""值,则此版本的行为将与您的有所不同,因为它将为这些值添加前缀。如果您希望在单行中与您的版本完全相同的行为,您可以编写以下内容:

map.get('type).filter(_.nonEmpty).map("prefix" + _).getOrElse("")

不过,这可能不是必需的——听起来您不希望地图中有空字符串。

于 2012-09-20T00:32:15.380 回答
5

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

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

val t = map('type)

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

于 2012-09-20T01:36:28.137 回答
1

您还可以使用 Scalaz Zero类型类,因此您的代码如下所示。一元运算符在OptionW上定义。

val t = ~map.get('type)                 // no prefix
val t = ~map.get('type).map("prefix"+_) // prefix

这是一个示例会话:

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> val map = Map('type -> "foo")
map: scala.collection.immutable.Map[Symbol,java.lang.String] = Map('type -> foo)

scala> ~map.get('type)
res3: java.lang.String = foo

scala> ~map.get('notype)
res4: java.lang.String = ""

scala> ~map.get('type).map("prefix"+_)
res5: java.lang.String = prefixfoo

scala> ~map.get('notype).map("prefix"+_)
res6: java.lang.String = ""
于 2012-09-23T08:46:07.053 回答
0

在阅读本书Play for Scala时,我拿起了这个在控制器中定义的代码片段,这可能是getOrElse更好的语法。

def show(ean: Long) = Action { implicit request =>

  Product.findByEan(ean).map { product =>
    Ok(views.html.products.details(product))
  }.getOrElse(NotFound)

}

其中,Product.findByEan(ean: Long)被定义为

def findByEan(ean: Long) = products.find(_ean == ean)
于 2014-04-11T13:48:05.180 回答
0
 val t = map.getOrElse("type","") match {case value if value !="" => s"prefix${value}" case _ => ""} 
于 2021-05-16T13:20:48.857 回答