В чем разница между List.empty, List() и new List()? Когда следует использовать какой?
List.empty vs. List() против нового списка()
Ответ 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 не компилирует