我想用if语句替换下面的匹配,最好比这更简洁。我个人觉得是否更容易在头脑中解析。
val obj = referencedCollection match{
case None => $set(nextColumn -> MongoDBObject("name" -> name))
case Some( collection) =>....}
是否存在等效的if语句或其他产生等效结果的方法?
答案 0 :(得分:7)
您可以通过map
和getOrElse
:
ox match {
case None => a
case Some(x) => f(x)
}
可以替换为
ox.map(f).getOrElse(a)
答案 1 :(得分:3)
有大量的选择(双关语):
if (referencedCollection != None) { ... } else { ... }
if (referencedCollection.isDefined) { ... } else { ... } // @Kigyo variant
if (referencedCollection.isEmpty) { /* None processing */ } else { ... }
答案 2 :(得分:3)
你可能不应该沉迷于继续在这样的条件下使用if
。它不是惯用的,很少更快,更冗长,需要中间变量,因此更容易出错等。
哦,使用$
符号的任何东西都是个坏主意!
除了匹配之外,您还可以使用以下其他一些模式:
val obj = referenceCollection.fold( $set(nextColumn -> MongoDBObject("name" -> name) ){
collection => ...
}
val obj = (for (collection <- referenceCollection) yield ...).getOrElse{
$set(nextColumn -> MongoDBObject("name" -> name)
}
val obj = referenceCollection.map{ collection => ... }.getOrElse{
$set(nextColumn -> MongoDBObject("name" -> name)
}
您基本上可以将map
视为if (x.isDefined) x.get...
的{{1}}分支,将if
分支视为getOrElse
分支。当然,它并不完全相同,因为不让else $set...
给出一个不返回值的表达式,而else
离开时会给你一个解压缩的getOrElse
。但思想流程非常相似。
无论如何,Option
是最紧凑的。请注意,这两者在fold
或match
语句之上都有一些运行时开销。
答案 3 :(得分:1)
你可以这样做:
val obj = if(referencedCollection.isDefined) { (work with referencedCollection.get) } else ...