我想用 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 ...