it-swarm.com.de

Unterschied zwischen einer Sequenz und einer Liste in Scala

Ich habe in vielen Beispielen gesehen, dass manchmal eine Seq verwendet wird, während ein anderes Mal die Liste ist ...

Gibt es einen anderen Unterschied als den, bei dem es sich um einen Scala) - Typ handelt und die Liste aus Java stammt?

266
opensas

In Java) Begriffen wäre Scalas Seq Javas List, und Scalas List wäre Javas LinkedList.

Beachten Sie, dass Seq ein trait ist, das Javas interface entspricht, jedoch den aufstrebenden Verteidigermethoden entspricht. Scalas List ist eine abstrakte Klasse, die um Nil und :: Erweitert wird. Dies sind die konkreten Implementierungen von List.

Wo also Javas List ein interface ist, ist Scalas List eine Implementierung.

Darüber hinaus ist Scalas List unveränderlich, was bei LinkedList nicht der Fall ist. Tatsächlich hat Java keine Entsprechung zu unveränderlichen Sammlungen (das Nur-Lese-Objekt garantiert, dass das neue Objekt nicht geändert werden kann, Sie können jedoch das alte und daher das "Nur-Lese-Objekt" ändern " einer).

Scalas List wird von Compilern und Bibliotheken in hohem Maße optimiert und ist ein grundlegender Datentyp in der funktionalen Programmierung. Es hat jedoch Einschränkungen und ist für die parallele Programmierung unzureichend. Heutzutage ist Vector eine bessere Wahl als List, aber die Gewohnheit ist schwer zu brechen.

Seq ist eine gute Verallgemeinerung für Sequenzen. Wenn Sie also auf Interfaces programmieren, sollten Sie diese verwenden. Beachten Sie, dass es tatsächlich drei davon gibt: collection.Seq, collection.mutable.Seq Und collection.immutable.Seq. Letzteres ist der "Standard", der in den Gültigkeitsbereich importiert wird.

Es gibt auch GenSeq und ParSeq. Die letzteren Methoden werden, wo immer möglich, parallel ausgeführt, während die erste Methode sowohl Seq als auch ParSeq übergeordnet ist. Dies ist eine geeignete Verallgemeinerung, 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.

358

Ein Seq ist eine Iterable mit einer definierten Reihenfolge von Elementen. Sequenzen stellen eine Methode apply() für die Indizierung bereit, die von 0 bis zur Länge der Sequenz reicht. Seq hat viele Unterklassen, einschließlich Queue, Range, List, Stack und LinkedList.

Ein 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 Scala FAQ :

enter image description here

63
Ceasar Bautista

In Scala erbt eine Liste von Seq, implementiert aber Product ; Hier ist die richtige Definition von Liste :

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[Anmerkung: die tatsächliche Definition ist ein bisschen komplexer, um sich an Scalas sehr anzupassen und sie zu nutzen leistungsstarkes Sammlungsframework.]

18
zakelfassi

Seq ist eine Eigenschaft, die List implementiert.

Wenn Sie Ihren Container als Seq definieren, können Sie jeden Container verwenden, der das Merkmal Seq implementiert.

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

Beachten Sie, dass

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

Ist nur eine kurze Hand für:

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)

wenn der Containertyp nicht angegeben ist, ist die zugrunde liegende Datenstruktur standardmäßig List.

15
Akavall

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 wir verwenden, werden in Form von Seq(1, 2, 3) oder List(1, 2, 3) initialisiert, die beide scala.collection.immutable.$colon$colon zurückgeben, daher kann man schreiben:

var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]

Infolgedessen würde ich argumentieren, dass das Einzige, was zählt, die Methoden sind, die Sie verfügbar machen möchten. Beispielsweise können Sie vorab :: Aus List verwenden, die ich mit +: Aus Seq und ich persönlich halte mich standardmäßig an Seq.

0
Profiterole