Подтвердить что ты не робот

List.empty vs. List() против нового списка()

В чем разница между List.empty, List() и new List()? Когда следует использовать какой?

4b9b3361

Ответ 1

Прежде всего, new List() не будет работать, так как класс List является абстрактным. Остальные два параметра определяются в объекте List:

override def empty[A]: List[A] = Nil
override def apply[A](xs: A*): List[A] = xs.toList

I.e., они по существу эквивалентны, поэтому в основном это вопрос стиля. Я предпочитаю использовать empty, потому что я нахожу его более ясным и сокращает круглые скобки.

Ответ 2

Из исходного кода List мы имеем:

object List extends SeqFactory[List] {
  ...
  override def empty[A]: List[A] = Nil
  override def apply[A](xs: A*): List[A] = xs.toList
  ... 
}

case object Nil extends List[Nothing] {...}

Итак, мы видим, что он точно такой же

Для полноты вы также можете использовать Nil.

Ответ 3

Для создания пустого списка, как говорили другие, вы можете использовать тот, который лучше всего подходит вам.

Однако для сопоставления шаблонов с пустым списком вы можете использовать только Nil

scala> List()
res1: List[Nothing] = List()

scala> res1 match {
     | case Nil => "empty"
     | case head::_ => "head is " + head
     | }
res2: java.lang.String = empty

EDIT: Исправление: case List() тоже работает, но case List.empty не компилирует