有没有更好的方法来编写下面的代码?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
对内联代码感兴趣
val t = map.get('type).getOrElse("").????
有没有更好的方法来编写下面的代码?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
对内联代码感兴趣
val t = map.get('type).getOrElse("").????
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("")
不过,这可能不是必需的——听起来您不希望地图中有空字符串。
还值得注意的是,在某些情况下,您可以一次调用替换多个常见.getOrElse
用法。.withDefaultValue
val map = complexMapCalculation().withDefaultValue("")
val t = map('type)
我不会说这是每次都应该做的事情,但它可以很方便。
您还可以使用 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 = ""
在阅读本书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)
val t = map.getOrElse("type","") match {case value if value !="" => s"prefix${value}" case _ => ""}