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.
