Scala bringt eine große Anzahl von Collection-Klassen in der Standarddistribution mit sich. Die Version 2.9 von Scala brachte erstmals spezielle Collection Klassen mit, welche für die Parallelverarbeitung vorgesehen sind. Diese Collections können z.B. direkt, ohne das der Programmierer eingreifen muss, auf mehreren Rechenkernen verarbeitet werden.
Grundsätzlich können wir die Scala Collection Klassen in folgende Kategorien einteilen:
Die unterschiedlichen Kategorien der Collections lassen sich auch der Paketstruktur entnehmen, in der die Scala Collections definiert sind. Diese sind:
scala.collection
scala.collection.generic
scala.collection.immutable
scala.collection.interface
scala.collection.mutable
scala.collection.parallel
scala.collection.parallel.imutable
scala.collection.parallel.mutable
scala.collection.script
scala.collection
Das Package scala.collection
bildet die Basis für alle Collections in
den Scala Standardbibliotheken (veränderlich, unveränderlich, sequenziell und parallel).
Collections aus diesem Package können veränderlich und unveränderlich sein.
Die enthaltenen Collections verändern nicht sich selbst, können jedoch evtl. von außen
verändert werden.
scala.collection.generic
scala.collection.generic
enthält Collection-Templates für gemeinsame
Operationen verschiedener Collection Typen. Der Anwender der Scala Collections wird in der Regel dieses Package
in der Regel nicht verwenden.
scala.collection.immutable
Im Package scala.collection.immutable
befinden sich die unveränderlichen,
sequenziellen
Scala Collections. Nach der Erzeugung einer Collection lässt diese sich nicht wieder
verändern. Jede Operation, die den Anschein einer Veränderung weckt, führt
zu einer neuen Collection auf Basis der Collection, auf der die Operation aufgerufen wurde.
Sequenzielle, unveränderliche Collections lassen sich mithilfe der Funktion par
in parallele, unveränderliche Collections umwandeln.
scala.collection.interface
Im Package scala.collection.interface
werden Traits für die verschiedenen
Collection Typen defiiert.
scala.collection.mutable
scala.collection.mutable
ist das Package für die veränderlichen,
sequenziellen Collections. Hier ist jedoch darauf zu achten, dass nicht alle Methoden (Funktionen)
entsprechender Collection zu einer Veränderung der jeweiligen Collection führt.
Einige Methoden erzeugen, wie bei den unveränderlichen Collections, neue Collections
auf Basis der Collection auf der die Methode aufgerufen wurde. Andere Methoden führen hingegen
zur Veränderung der ursprünglichen Collection. Hilfe bei der Unterscheidung
kann die Scala-API liefern.
Sequenzielle, veränderliche Collections lassen sich mithilfe der Funktion par
in parallele, veränderliche Collections umwandeln.
scala.collection.parallel.immutable
Wie der Name schon sagt, enthält das Package scala.collection.parallel.immutable
die Elemente der unveränderlichen, parallelen Collections in Scala. Unveränderliche,
parallele Collections können mithilfe der Funktion seq
in
sequenzielle, unveränderliche Collections umgewandelt werden.
scala.collection.parallel.mutable
Auch hier ist der Name Programm. Das Package scala.collection.paralell.mutable
enthält die Elemente der veränderlichen, parallelen Collections. Wie auch bei
den sequenziellen, veränderlichen Collections, führt ein Aufruf einer
Funktion auf die Collection nicht unbedingt zu einer Veränderung der Collection.
Vielfach erzeugen werden die Funktionen gemeinsam mit den unveränderlichen Collections
verwendet und erzeugen neue Collections auf deren Basis. Mithilfe der Funktion
seq
kann aus einer parallelen, veränderlichen Collection eine
sequenzielle, veränderliche Collection erzeugen.
scala.collection.parallel
Im Package scala.collection.parallel
sind die Basiselemente
(im Wesentlichen Traits und Objects) für die parallelen Collections definiert.
Sie bilden die Basis für veränderliche und unveränderliche parallele
Collections in Scala.
scala.collection.script
Im Package scala.collection.script
sind weitere Bestandteile der Scala Collections
definiert, welche in der Regel vom Anwender nicht verwendet werden.
Es gibt eine Vielzahl unterschiedlicher Collections, die jeweils Vor- und Nachteile in ihrer Anwendung haben. Die nachfolgende Auflistung zeigt einige Typen von Collections, die auch in Scala Verwendung finden.
Eine List ist eine geordnete Menge von gleichartigen Typen. Häufig werden List
Datenstrukturen
als Linked-List implementiert, bei denen die Elemente nicht an einem fest definierten
Platz im Speicher gehalten werden. Jedes Element einer List
kennt dabei das nachfolgende
Element in der Liste. Auf die einzelnen Elemente einer List
kann über Ihren
Index zugegriffen werden.
Ein Stream
ist eine Datenstruktur ähnlich der List
.
Die Bestimmung des Elementinhaltes erfolgt jedoch erst beim ersten Zugriff auf das Element.
Eine Queue ist eine Datenstruktur, die ein Menge von Elementen enthält, die nach dem First In First Out (FIFO) Prinzip verarbeitet werden.
Eine Seq
ist eine geordnete Datenstruktur gleichartiger Elemente. Auf
die Elemente einer Seq
kann über Ihren Index zugegriffen werden.
Ein Stack ist eine Datenstruktur, die nach dem Last In First Out (LIFO) Prinzip arbeitet, d.h. das zuletzt hinzugefügte Element wird als Erstes entnommen.
Ein Set ist eine Datenstruktur ähnlich der List. Der Hauptunterschied liegt darin, dass ein Set keine doppelten Elemente enthält.
Eine Map enthält Schlüssel - Werte Paare. Die Schlüssel sind eindeutig. Werte können mehrfach enthalten sein.
Ein Range
ist eine Menge von Int
Werten. Die Int Werte
sind dabei von einem Startwert bis zu einem Endwert in einer festen Schrittweite
(nicht null aber evtl. Negativ) geordnet.
Ein Vector
ist eine geordnete Datenstruktur, auf deren Elemente über Ihren Index zugegriffen werden kann.
Ein Vector ist auf die Verarbeitung der Elemente am Anfang des Vector
optimiert.
Das Package scala.collection
definiert die "High-Level" Abstraktionen der Scala
Collections. Sie bieten die Basis für veränderliche (engl. mutable), unveränderliche
(eng. immutable) sowie für die parallelen (veränderliche und unveränderliche) Collections.
Nachfolgend ein Diagramm zur allgemeinen Collection Hierarchie1.
Wie dem Bild zu entnehmen ist, sind die High-Level Abstraktionen in drei Bereiche unterteilt.
Der mittlere Bereich mit GenTraversable
, GenIterable
und GenSeq
bilden die Basis für alle Collections. Im linken Bereich sind mit Traversable
,
Iterable
und Seq
die High-Level Abstraktionen der sequenziellen
Collections zu finden. Mit ParIterable
und ParSeq
sind die
entsprechenden Abstraktionen der parallel Collections auf der rechten Seite zu finden.
Auch wenn es Vielen klar ist, möchte ich hier kurz auf die parallel Collections eingehen.
Wie der Name es vermuten lässt, sind parallele Collections für parallele (nebenläufige)
Verarbeitung gedacht. Die Parallelität wird dabei beim Aufruf von Methoden wir foreach
automatisch erzeugt. Dabei werden die im Rechner vorhandenen Kerne (Hyperthreads) automatisch
ausgenutzt. Mithilfe von parallel Collections können wir somit auf einfache Weise
die im Rechner vorhandenen Kerne ausnutzen. Zum Anfang braucht man sich auch keine Gedanken
zu machen, ob wir sequenzielle oder parallele Collections einsetzen. Für jede Collection
gibt es die Methode par
um aus einer sequenziellen Collection eine parallel Collection
zu machen und die Methode seq
um aus einer parallelen Collection eine sequenzielle
Collection zu machen.
Die High-Level Abstraktionen sequenzieller Collections befinden sich
im Package scala.collection
. Das nachfolgende Diagramm zeigt den Aufbau der
High-Level Abstraktionen sequenzieller Collections in Scala.
Importieren wir keine Collection Klassen bzw. Packages und geben keinen voll qualifizierenden
Namen an verwenden wir in Scala standardmäßig unveränderliche Collections.
Dass wir diese Collections nicht importieren müssen, ist keine Besonderheit des entsprechenden
Packages, sondern liegt daran, dass in Scala Typen definiert sind (welche automatisch importiert werden),
die auf die entsprechenden unveränderlichen Collections zeigen. Beispiele für derartige
Collection Klassen sind List
, Range
, Stream
, ... .
Martin Odersky, Lex Spoon
The Architecture of Scala Collections
http://www.scala-lang.org/docu/files/collections-api/collections-impl.html#
Martin Odersky, Lex Spoon
The Scala 2.8 Collection API
http://lampwww.epfl.ch/~odersky/whatsnew/collections-api/collections.html
Community-driven documentation for Scala
Performance Characteristics
http://docs.scala-lang.org/overviews/collections/performance-characteristics.html
Heiko Seeberger
Scala 2.8 - Die wichtigsten Neuerungen
Teil 2: Scala 2.8: Die überarbeitete Collection Library