Teil 6: Collections

Das Herzstück einer jeden Programmiersprache sind ihre Collections. Sie werden immer benötigt sobald Datensätze zusammengefasst werden und stellen viele Möglichkeiten bereit die Daten zu transformieren. So gibt es:

  • Seq: Können Datensätze, die vom gleichen Typ sind, aufnehmen und eignen sich besonders gut um durchlaufen zu werden oder um auf die Daten per Index zuzugreifen.
  • Set: Speichert nur Unikate, d.h. es kann kein Datensatz mehrfach vorkommen. Eignen sich besonders gut um zu schauen ob bestimmte Datensätze schon existieren.
  • Map: Speichert Key-Value-Paare. Zu jedem gespeicherten Key wird ein Value gespeichert, den man anhand des Keys leicht wiederfinden kann.

Alle Collections erben vom Typ `Iterable`, der wiederum vom Type `Traversable` erbt. Das ganze nochmal in einer grafischen Darstellung:

Alle Collections gibt es sowohl in einer veränderlichen und in einer unveränderlichen Variante. Automatisch importiert wird die unveränderliche Variante. Wenn Collections mit veränderlichem Inhalt benötigt werden, dann müssen diese explizit referenziert werden, aber dazu später mehr.

Unveränderlich heißt, dass jede Operation auf eine Collection immer eine komplett neue Collection gleichen Typs erstellt, die alten Daten bleiben bis zu ihrer Destruktion unangetastet. Das Package in dem sich die unveränderlichen Objekte befinden heißt `scala.collection.immutable`, equivalent dazu nimmt das Package `scala.collection.mutable` die veränderlichen Collections auf. Nun noch zwei Graphen mit den Namen der konkreten Implementierungen.

Für die Unveränderlichen:

Die Veränderlichen:

Und noch die Legende:

Da man keine Lust hat die ganze Zeit die Collections über ihren vollen Package-Namen zu referenzieren bzw. diesen zu importieren geschieht dies automatisch. Genau genommen werden alle Objekte im Package `scala` und alle Member von Objekt `scala.Predef` automatisch importiert. Innerhalb von Predef werden verschieden Typdefinitionen festgelegt, u.A. für die unveränderlichen Collections. Die Methode `Console.println` erhält z.B. auch eine Neudefinition, damit sie komfortabel nur mit `println` aufgerufen werden kann. Ein Blick in die Sourcen von Predef lohnt sich also – es gibt viel zu entdecken.

Bei der Entwicklung der Collections wurde viel Wert auf eine einheitliche API genommen. Dies bedeutet, dass die wichtigsten Operationen bei jedem Collection-Typ die gleichen sind. Dabei spielt es keine Rolle ob mit veränderlichen oder unveränderlichen oder gar mit den Collections gearbeitet wird, die parallele Datenverarbeitung erlauben. Einzig allein der Typ List definiert einige Methoden, die auch nur dieser Typ kennt – man sollte also wenn möglich nur in einem möglichst kleinen Sichtbarkeitsbereich mit List arbeiten und nach außen hin den Typ mit seiner Schnittstelle Seq ansprechen.

No comments yet

Hinterlasse einen Kommentar