Différence entre un Seq et une liste dans Scala
J'ai vu dans de nombreux exemples que parfois un Seq est utilisé, tandis que d'autres fois est la liste...
Y a-t-il une différence, autre que la première étant un type Scala et la liste venant de Java?
4 réponses
En Java termes, Scala Seq
serait de Java List
, et Scala List
est de Java LinkedList
.
Notez que Seq
est un trait
, qui est équivalent à interface
de Java, mais avec l'équivalent des méthodes defender montantes. List
de Scala est une classe abstraite qui est étendue par Nil
et ::
, qui sont les implémentations concrètes de List
.
Donc, où List
de Java est un interface
, List
de Scala est une implémentation.
Au-delà de cela, le List
de Scala est immuable, ce qui n'est pas le cas de LinkedList
. En fait, Java n'a pas d'équivalent aux collections immuables (la lecture seule garantit seulement que le nouvel objet ne peut pas être modifié, mais vous pouvez toujours changer l'ancien, et, par conséquent, le "lecture seule").
Scala List
est hautement optimisé par le compilateur et les bibliothèques, et c'est un type de données fondamental dans la programmation fonctionnelle. Cependant, il a des limites et il est inadéquat pour la programmation parallèle. Ces jours-ci, Vector
est un meilleur choix que List
, mais l'habitude est difficile à briser.
Seq
est une bonne généralisation pour les séquences, donc si vous programmez à des interfaces, vous devez l'utiliser. Notez qu'il y en a en fait trois: collection.Seq
, collection.mutable.Seq
et collection.immutable.Seq
, et c'est ce dernier qui est le "défaut" importé dans la portée.
Il y a aussi GenSeq
et ParSeq
. Ces dernières méthodes s'exécutent en parallèle si possible, tandis que la première est parent à la fois Seq
et ParSeq
, étant une généralisation appropriée lorsque le parallélisme d'un code ne le fait pas question. Ils sont tous deux relativement récemment introduits, de sorte que les gens ne les utilisent pas encore beaucoup.
A Seq est un itérable qui a un ordre défini d'éléments. Les séquences fournissent une méthode apply()
pour l'indexation, allant de 0 jusqu'à la longueur de la séquence. Seq a de nombreuses sous-classes, y compris file D'attente, Range, List, Stack et LinkedList.
A List est un Seq qui est implémenté comme une liste liée immuable. Il est préférable d'utiliser dans les cas avec des modèles d'accès dernier entré, premier sorti (LIFO).
Voici la hiérarchie des classes de collection complète de la Scala FAQ :
En Scala, une Liste hérite de Seq, mais implémente Produit; ici est la bonne définition de List :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Note: La définition réelle est un peu plus complexe, afin de s'intégrer et d'utiliser le très puissant framework de collecte de Scala.]
Seq
est un trait que List
implémente.
Si vous définissez votre conteneur Seq
, vous pouvez utiliser un conteneur qui implémente Seq
trait.
scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int
scala> sumUp(List(1,2,3))
res41: Int = 6
scala> sumUp(Vector(1,2,3))
res42: Int = 6
scala> sumUp(Seq(1,2,3))
res44: Int = 6
Notez que
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Est juste une main courte pour:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Si le type de conteneur n'est pas spécifié, la structure de données sous-jacente est par défaut List
.