В чем разница между 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
не компилирует