web-dev-qa-db-fra.com

List.empty vs. List () vs. new List ()

Quelle est la différence entre List.empty, List() et new List()? Quand devrais-je utiliser quoi?

28
fredoverflow

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.

33
Travis Brown

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.

12
Christopher Chiche

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

4
Paolo Falabella