0

我想用 if 语句替换下面的匹配,最好比这更简洁。我个人发现 if's 更容易在脑海中解析。

val obj = referencedCollection match{
            case None => $set(nextColumn -> MongoDBObject("name" -> name))
            case Some( collection) =>....}

是否有等效的 if 语句或其他产生等效结果的方法?

4

4 回答 4

7

map您可以用和的组合替换模式匹配getOrElse

ox match {
  case None => a
  case Some(x) => f(x)
}

可以替换为

ox.map(f).getOrElse(a)
于 2013-10-22T19:59:27.487 回答
3

有大量的选项(双关语):

if (referencedCollection != None) { ... } else { ... }
if (referencedCollection.isDefined) { ... } else { ... } // @Kigyo variant
if (referencedCollection.isEmpty) { /* None processing */ } else { ... }
于 2013-10-22T19:18:07.477 回答
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...分支,ifgetOrElse分支视为else $set...分支。当然,这并不完全相同,因为省略了else会给你一个不返回值的表达式,而留下getOrElse一个 unpacked Option。但是思想流非常相似。

反正fold是最紧凑的。match请注意,这两个在orif语句之上都有一点运行时开销。

于 2013-10-22T22:17:20.200 回答
1

你可以这样做:

val obj = if(referencedCollection.isDefined) { (work with referencedCollection.get) } else ...
于 2013-10-22T18:53:01.677 回答