Quelle est la différence entre List.empty
, List()
et new List()
? Quand devrais-je utiliser quoi?
Tout d'abord, new List()
ne fonctionnera pas, car la classe List
est abstraite. Les deux autres options sont définies comme suit dans l'objet List
:
override def empty[A]: List[A] = Nil
override def apply[A](xs: A*): List[A] = xs.toList
C'est-à-dire qu'ils sont essentiellement équivalents, c'est donc principalement une question de style. Je préfère utiliser empty
parce que je le trouve plus clair, et cela réduit les parenthèses.
Du code source de List nous avons:
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] {...}
On voit donc que c'est exactement la même chose
Pour être complet, vous pouvez également utiliser Nil
.
Pour les créations d'une liste vide, comme d'autres l'ont dit, vous pouvez utiliser celle qui vous convient le mieux.
Cependant, pour la correspondance de motifs avec une liste vide, vous ne pouvez utiliser que Nil
scala> List()
res1: List[Nothing] = List()
scala> res1 match {
| case Nil => "empty"
| case head::_ => "head is " + head
| }
res2: Java.lang.String = empty
MODIFIER : Correction: case List()
fonctionne aussi, mais case List.empty
ne compile pas