我想用 if 语句替换下面的匹配,最好比这更简洁。我个人发现 if's 更容易在脑海中解析。
val obj = referencedCollection match{
case None => $set(nextColumn -> MongoDBObject("name" -> name))
case Some( collection) =>....}
是否有等效的 if 语句或其他产生等效结果的方法?
我想用 if 语句替换下面的匹配,最好比这更简洁。我个人发现 if's 更容易在脑海中解析。
val obj = referencedCollection match{
case None => $set(nextColumn -> MongoDBObject("name" -> name))
case Some( collection) =>....}
是否有等效的 if 语句或其他产生等效结果的方法?
map
您可以用和的组合替换模式匹配getOrElse
:
ox match {
case None => a
case Some(x) => f(x)
}
可以替换为
ox.map(f).getOrElse(a)
有大量的选项(双关语):
if (referencedCollection != None) { ... } else { ... }
if (referencedCollection.isDefined) { ... } else { ... } // @Kigyo variant
if (referencedCollection.isEmpty) { /* None processing */ } else { ... }
您可能不应该沉迷于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...
分支,if
将getOrElse
分支视为else $set...
分支。当然,这并不完全相同,因为省略了else
会给你一个不返回值的表达式,而留下getOrElse
一个 unpacked Option
。但是思想流非常相似。
反正fold
是最紧凑的。match
请注意,这两个在orif
语句之上都有一点运行时开销。
你可以这样做:
val obj = if(referencedCollection.isDefined) { (work with referencedCollection.get) } else ...