使用大小写/匹配或如果/其他匹配空列表?

时间:2019-02-22 18:20:38

标签: scala pattern-matching

除了样式以外,是否有任何理由应该使用大小写/匹配而不是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.
  }

2 个答案:

答案 0 :(得分:3)

如果您只是测试为空/不为空,那么几乎没有选择,if可能更有意义。有多个选项时,match会开始播放:

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

通常,您可以通过使用适当的方法来避免或至少推迟此测试。例如,take(1)处理一个空列表,而head将失败。并且headOption.map(...)可用于安全地处理第一个元素(如果存在)。

答案 1 :(得分:3)

蒂姆(Tim)已经有了一个很好的答案,但是我想对它提出一个稍微不同的角度。

对于列表(或其他集合),.head.tail是不安全的,并且if使得很容易在错误的分支中意外使用它们(或者根本忘记测试) ,而case则无需调用这些函数。

如果您的函数不需要调用它们并且不需要检查更复杂的条件,则也可以使用if