© Excellent backgrounds/Shutterstock.com
Java Collections à la Goldman Sachs

JCF +


Die Goldman Sachs Collections (GS Collections) ist eine Erweiterung des Java Collections Frameworks (JCF). Das Projekt entstand als interne Bibliothek der Entwicklungsabteilung von Goldman Sachs. Vor zwei Jahren wurde es als Open Source unter der Apache-Lizenz veröffentlicht [1]. Mit der kürzlich veröffentlichten Version 5.0.0 wurde das Projekt auf Java 8 umgestellt. Es folgt vielen Paradigmen, die mit Java 8 und als neue Features des JCF hinzugekommen sind.

Für die üblichen Interfaces wie List, Map und Set existieren eigene Implementierungen. Bei den eigenen Implementierungen von ArrayList, HashMap und HashSet verspricht das Framework einen Performancevorteil gegenüber den JCF-Klassen. Darüber hinaus erweitert GS Collections den Vorrat an Datenstrukturen und bietet ein vielfältiges API zur Transformation der Collections-Typen mithilfe von Funktions- und Prädikatsobjekten. Die Bibliothek ist dabei schon auf die neuen Lambda-Ausdrücke vorbereitet.

Iteration Pattern

Ein zentrales Konzept der Collections ist die interne bzw. implizite Iteration. Dabei bedient sich die Bibliothek Mustern, die mittlerweile in viele populäre imperative Sprachen Einzug gehalten haben. Zudem ist die interne Iteration auch ein neues Feature des JCF in Java 8. Die Macher von GS Collections berufen sich darauf, von Smalltalk und Ruby inspiriert worden zu sein.

Dieses Konzept steht im Gegensatz zum herkömmlichen imperativen Durchlaufen einer for- oder while-Schleife. Die Datenstrukturen bieten deklarative Methoden, die die Implementierung der Iteration verbergen. Möchte man beispielsweise aus einer Liste von Personen die Liste der Namen aller Personen bilden, so würde man bei expliziter Iteration folgendermaßen vorgehen:

List<Person> persons = ... List<String> names = new ArrayList<String>(); for(Person person : persons){ names.add(person.getName()); }

Sämtliche Datenstrukturen, die GS Collections bietet, implementieren das Iterable-Interface, mit dem sich diese Aufgabe wie folgt umsetzen lässt:

MutableList<Person> persons = ... MutableList<String> names = collect.persons(new Functions<Person, String>() { apply(Person person){ return person.getName(); } });

Die Funktionalität des Namenzugriffs wird an die Iterationsmethode collect übergeben. Die Iteration selbst wird nicht explizit aufgeschrieben. Üblicherweise werden diese anonymen Interfaces als Konstanten der Person-Klasse definiert, sodass die erste Zeile lesbarer wird:

MutableList<String> names = persons.collect(Person.GET_N...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang