Scala 使用case/Match或if/else匹配空列表?

Scala 使用case/Match或if/else匹配空列表?,scala,pattern-matching,Scala,Pattern Matching,是否有任何理由认为应该使用case/match而不是if/else来匹配空列表,而不是样式?例如: val a: List def compute: Int = if (a.isEmpty) 0 else a.sum 对 def compute: Int = a match { case Nil => 0 case _ => a.sum // This is bad. For sake of illustration only. } 如果您只

是否有任何理由认为应该使用case/match而不是if/else来匹配空列表,而不是样式?例如:

val a: List

def compute: Int = 
  if (a.isEmpty) 0
  else a.sum

def compute: Int = 
  a match {
    case Nil => 0
    case _ => a.sum // This is bad. For sake of illustration only.
  }

如果您只是测试empty/notempty,那么没有什么可供选择的,If可能更有意义。当有多个选项时,match进入游戏:

a match {
  case Nil => 0
  case hd::Nil => 1
  case hd::tl => 2
}

通常情况下,您可以通过使用适当的方法避免或至少推迟此测试。例如,take1在空列表上工作,而head将失败。和头选项。地图。。。可以用来安全地处理第一个元素,如果存在的话。

蒂姆已经有了一个很好的答案,但我想用一个稍微不同的角度

对于列表或其他集合,.head和.tail是不安全的,如果不小心在错误的分支中使用它们,或者根本忘记测试,那么case就不需要调用这些函数


如果您的函数不需要调用它们,也不需要检查更复杂的条件,那么您也可以使用If。

在这种情况下,.sum在空列表中已经有您想要的行为,所以您可以直接调用它。@BrianMcCutchon Right。正如我所说的那样。这只是一个例子,所以我听到的是,如果我所关心的只是一个列表的空或非空,那么if就足够了。谢谢