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?

231
demandé sur Jonik 2012-06-03 03:13:48

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.

302
répondu Daniel C. Sobral 2018-09-06 14:39:38

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 :

entrez la description de l'image ici

32
répondu Ceasar Bautista 2017-12-12 23:31:09

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.]

16
répondu zakelfassi 2016-11-04 13:44:47

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.

7
répondu Akavall 2017-07-26 20:11:03