Ich habe in vielen Beispielen gesehen, dass manchmal eine Seq verwendet wird, während manchmal die Liste ...
Gibt es einen Unterschied, außer dass der erste ein Scala-Typ ist und die Liste aus Java stammt?
quelle
Ich habe in vielen Beispielen gesehen, dass manchmal eine Seq verwendet wird, während manchmal die Liste ...
Gibt es einen Unterschied, außer dass der erste ein Scala-Typ ist und die Liste aus Java stammt?
In Java-Begriffen Seq
wäre Scala Java List
und Scala List
Java LinkedList
.
Beachten Sie, dass dies a Seq
ist trait
, was Java entspricht interface
, aber dem Äquivalent aufstrebender Verteidigungsmethoden entspricht. Scala's List
ist eine abstrakte Klasse, die um Nil
und erweitert wird und ::
deren konkrete Implementierungen sind List
.
Wo also Java List
ist interface
, ist Scala List
eine Implementierung.
Darüber hinaus ist Scala List
unveränderlich, was bei nicht der Fall ist LinkedList
. Tatsächlich hat Java keine Entsprechung zu unveränderlichen Sammlungen (das schreibgeschützte Element garantiert nur, dass das neue Objekt nicht geändert werden kann, Sie können jedoch das alte und daher das schreibgeschützte Objekt ändern).
Scala's List
wird von Compilern und Bibliotheken stark optimiert und ist ein grundlegender Datentyp in der funktionalen Programmierung. Es hat jedoch Einschränkungen und ist für die parallele Programmierung nicht geeignet. Heutzutage Vector
ist es eine bessere Wahl als List
, aber Gewohnheit ist schwer zu brechen.
Seq
ist eine gute Verallgemeinerung für Sequenzen. Wenn Sie also auf Schnittstellen programmieren, sollten Sie diese verwenden. Beachten Sie, dass es tatsächlich drei davon gibt : collection.Seq
, collection.mutable.Seq
und collection.immutable.Seq
, und es ist das letztere, das der "Standard" ist, der in den Bereich importiert wird.
Es gibt auch GenSeq
und ParSeq
. Die letzteren Methoden werden nach Möglichkeit parallel ausgeführt, während die ersteren beiden übergeordnet sind Seq
und ParSeq
eine geeignete Verallgemeinerung darstellen, wenn die Parallelität eines Codes keine Rolle spielt. Sie sind beide relativ neu eingeführt, so dass die Leute sie noch nicht viel benutzen.
String
es keine Sammlung ist, ist es ein Beispiel für unveränderliche Klassen, die Java-Programmierern vertraut sind.UnsupportedOperationException
. Um eine unveränderliche Liste in Java zu erstellen, verwenden Sie Collections.unmodutableList (). Ebenso gibt es andere Methoden für Sets, Maps usw. docs.oracle.com/javase/6/docs/api/java/util/…Eine Seq ist eine Iterable mit einer definierten Reihenfolge von Elementen. Sequenzen bieten eine Methode
apply()
zur Indizierung, die von 0 bis zur Länge der Sequenz reicht. Seq hat viele Unterklassen, einschließlich Queue, Range, List, Stack und LinkedList.Eine Liste ist eine Sequenz, die als unveränderliche verknüpfte Liste implementiert ist. Es wird am besten in Fällen mit LIFO-Zugriffsmustern (Last-In First-Out) verwendet.
Hier ist die vollständige Hierarchie der Sammlungsklassen aus den Scala-FAQ :
quelle
Seq
ist eine Eigenschaft, dieList
implementiert.Wenn Sie Ihren Container als definieren
Seq
, können Sie jeden Container verwenden, der dasSeq
Merkmal implementiert .Beachten Sie, dass
Ist nur eine kurze Hand für:
Wenn der Containertyp nicht angegeben ist, wird standardmäßig die zugrunde liegende Datenstruktur verwendet
List
.quelle
In Scala erbt eine Liste von Seq, implementiert jedoch Product . Hier ist die richtige Definition von Liste :
[Hinweis: Die eigentliche Definition ist etwas komplexer, um in das sehr leistungsstarke Sammlungsframework von Scala zu passen und es zu nutzen.]
quelle
Wie @ daniel-c-sobral sagte, erweitert List das Merkmal Seq und ist eine abstrakte Klasse, die von
scala.collection.immutable.$colon$colon
(oder::
kurz) implementiert wird. Abgesehen von den technischen Aspekten ist jedoch zu beachten, dass die meisten von uns verwendeten Listen und Seqs in Form vonSeq(1, 2, 3)
oder vonList(1, 2, 3)
beiden zurückgegeben werdenscala.collection.immutable.$colon$colon
daher kann man schreiben:Infolgedessen würde ich argumentieren, dass das einzige, was zählt, die Methoden sind, die Sie verfügbar machen möchten, zum Beispiel, um vorab zu verwenden, dass Sie
::
aus der Liste verwenden können, mit der ich+:
aus Seq überflüssig bin, und ich persönlich halte mich standardmäßig an Seq.quelle