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

bhmjp9jg  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(351)

是否有任何理由认为匹配空列表应该使用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.
  }
k3fezbri

k3fezbri1#

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

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

通常情况下,您可以通过使用适当的方法避免或至少推迟此测试。例如, take(1) 在空列表上工作 head 会失败的。以及 headOption.map(...) 可用于安全处理第一个元素(如果存在)。

vi4fp9gy

vi4fp9gy2#

蒂姆已经有了一个很好的答案,但我想换一个Angular 。
对于列表(或其他集合), .head 以及 .tail 不安全和 if 很容易在错误的分支中意外地使用它们(或者完全忘记测试),而 case 无需调用这些函数。
如果您的函数不需要调用它们,也不需要检查更复杂的条件,那么您也可以使用 if .

相关问题