Совпадение пустого списка с использованием case / match или if / else? - PullRequest
0 голосов
/ 22 февраля 2019

Есть ли причина, по которой сопоставление пустого списка должно выполняться с использованием регистра / совпадения вместо if / else, отличного от style?Например:

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 голосов
/ 23 февраля 2019

У Тима уже есть хороший ответ, но я бы хотел немного изменить его.

Для списков (или других коллекций), .head и .tail небезопасны и ifпозволяет легко использовать их в неправильной ветке (или вообще забыть тестировать), тогда как case исключает необходимость вызова этих функций.

Если вашей функции не нужно вызывать их и не нужно проверять более сложные условия, вы также можете перейти с if.

0 голосов
/ 22 февраля 2019

Если вы просто тестируете пустое / не пустое, то выбирать не из чего, и if, возможно, более значимо.match вступает в игру, когда есть несколько опций:

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

Часто бывает так, что вы можете избежать или хотя бы отложить этот тест, используя соответствующие методы.Например, take(1) работает с пустым списком, тогда как head завершится ошибкой.И headOption.map(...) может использоваться для безопасной обработки первого элемента, если он есть.

...