J'ai vu dans de nombreux exemples que parfois une Seq est utilisée, tandis que d'autres fois est la liste ...
Y a-t-il une différence, autre que l'ancien étant un type Scala et la liste venant de Java?
la source
J'ai vu dans de nombreux exemples que parfois une Seq est utilisée, tandis que d'autres fois est la liste ...
Y a-t-il une différence, autre que l'ancien étant un type Scala et la liste venant de Java?
En termes Java, Scala Seq
serait Java List
et Scala List
serait JavaLinkedList
.
Notez que Seq
c'est un trait
, qui est équivalent à Java interface
, mais avec l'équivalent des méthodes de défense montantes. Scala List
est une classe abstraite qui est étendue par Nil
et ::
, qui sont les implémentations concrètes de List
.
Ainsi, lorsque Java List
est un interface
, Scala List
est une implémentation.
Au-delà de cela, Scala List
est immuable, ce qui n'est pas le cas de LinkedList
. En fait, Java n'a pas d'équivalent aux collections immuables (la chose en lecture seule garantit que le nouvel objet ne peut pas être changé, mais vous pouvez toujours changer l'ancien et, par conséquent, celui en "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 est inadéquat pour la programmation parallèle. De nos jours, Vector
c'est un meilleur choix List
, mais l'habitude est difficile à briser.
Seq
est une bonne généralisation pour les séquences, donc si vous programmez sur des interfaces, vous devriez l'utiliser. Notez qu'il existe en fait trois d'entre eux: collection.Seq
, collection.mutable.Seq
et collection.immutable.Seq
, et il est celui - ci qui est le « défaut » importé dans le périmètre.
Il y a aussi GenSeq
et ParSeq
. Ces dernières méthodes fonctionnent en parallèle lorsque cela est possible, tandis que la première est parent des deux Seq
et ParSeq
, étant une généralisation appropriée lorsque le parallélisme d'un code n'a pas d'importance. Ils sont tous deux relativement récents, donc les gens ne les utilisent pas encore beaucoup.
String
ne s'agisse pas d'une collection, c'est un exemple de classes immuables familières aux programmeurs Java.UnsupportedOperationException
cause de cela. Pour créer une liste immuable en Java, vous utilisez Collections.unmodifiableList () et de même il existe d'autres méthodes pour les ensembles, les cartes, etc. docs.oracle.com/javase/6/docs/api/java/util/…Un Seq est un Iterable qui a un ordre défini d'éléments. Les séquences fournissent une méthode
apply()
d'indexation, allant de 0 à la longueur de la séquence. Seq possède de nombreuses sous-classes, notamment Queue, Range, List, Stack et LinkedList.Une liste est une séquence qui est implémentée en tant que liste liée immuable. Il est préférable de l'utiliser dans les cas avec des modèles d'accès dernier entré, premier sorti (LIFO).
Voici la hiérarchie complète des classes de collection de la FAQ Scala :
la source
Seq
est un trait quiList
met en œuvre.Si vous définissez votre conteneur comme
Seq
, vous pouvez utiliser n'importe quel conteneur qui implémenteSeq
trait.Notez que
Est juste une main courte pour:
si le type de conteneur n'est pas spécifié, la structure de données sous-jacente est par défaut
List
.la source
Dans Scala, une List hérite de Seq, mais implémente Product ; voici la bonne définition de List :
[Remarque: la définition actuelle est un peu plus complexe, afin de s'intégrer et d'utiliser le cadre de collecte très puissant de Scala.]
la source
Comme l'a dit @ daniel-c-sobral, List étend le trait Seq et est une classe abstraite implémentée par
scala.collection.immutable.$colon$colon
(ou::
pour faire court), mais à part les détails techniques, gardez à l'esprit que la plupart des listes et des séquences que nous utilisons sont initialisées sous la forme deSeq(1, 2, 3)
ouList(1, 2, 3)
qui retournent toutes les deuxscala.collection.immutable.$colon$colon
, on peut donc écrire:En conséquence, je dirais que la seule chose qui importe, ce sont les méthodes que vous souhaitez exposer, par exemple pour ajouter au début, vous pouvez utiliser à
::
partir de List que je trouve redondant avec+:
de Seq et je persiste personnellement à Seq par défaut.la source