在选项[X]上使用if代替匹配

时间:2013-10-22 18:42:56

标签: scala scala-option

我想用if语句替换下面的匹配,最好比这更简洁。我个人觉得是否更容易在头脑中解析。

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

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

4 个答案:

答案 0 :(得分:7)

您可以通过mapgetOrElse

的组合替换模式匹配
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是最紧凑的。请注意,这两者在foldmatch语句之上都有一些运行时开销。

答案 3 :(得分:1)

你可以这样做:

val obj = if(referencedCollection.isDefined) { (work with referencedCollection.get) } else ...