© punsayaporn/Shutterstock.com
Java 8: Lambdas, Streams und Doppelpunktoperator

Kalter Kaffee?


Bereits seit Major Release 8 gibt es die Lambda Expressions. Diese funktionalen Ausdrücke werden häufig im Zusammenhang mit Streams genannt – ein weiteres neues Feature von Java 8. Und da ist noch etwas, das uns seitdem immer wieder über den Weg läuft: der Doppelpunktoperator. Diese Features wurden nicht ohne Grund in einem gemeinsamen Release eingeführt.

Mittlerweile gibt es kaum noch ein Java-Projekt oder eine Bibliothek, das oder die nicht mindestens Java 8 als Baseline hat. Lambdas werden dadurch nicht nur immer häufiger eingesetzt, sondern auch gerne immer komplexer.

Es war vermutlich nie wichtiger als heute, die Funktionsweise dahinter auch im Detail zu verstehen. Und weil das im Alltag vielleicht schnell mal aus dem Blick gerät, bietet dieser Artikel je nach Erfahrung des Lesers entweder einen sehr kompakten Einstieg in die Zusammenhänge der funktionalen Sprachfeatures von Java oder er hält hoffentlich dennoch ein paar Aha-Momente für diejenigen bereit, die schon länger damit arbeiten.

Das sogenannte Lambda-Kalkül [1] ist eine mathematische Abhandlung zur Schreibweise und Mächtigkeit von Funktionen. Jetzt ist jede Java-Methode mit Rückgabewert letztlich auch eine Funktion. Was ist nun eigentlich der Vorteil von Lambda Expressions gegenüber einer normalen Methode?

Beispiel: Der java.util.Comparator ist ein Interface mit einer relevanten Methode: compare. Diese Methode ist mathematisch gesehen eine Funktion mit zwei Parametern und einem Integer-Rückgabewert. Bereits vor Java 8 gab es die Möglichkeit, das wie in Listing 1 zu implementieren.

Listing 1: Anonyme Instanz von Comparator

List<Person> personen = new ArrayList<>(); ... Collections.sort(personen, new Comparator<Person>() { @Override public int compare(Person x, Person y) { return x.getAlter().compareTo(y.getAlter()); } });

Es handelt sich hierbei um eine anonyme Implementierung von Comparator, die inline notiert werden konnte. Die Ausführung findet außerhalb des lokalen Scopes bzw. Kontexts statt, in dem z. B. die lokale Variable personen definiert ist. Dennoch könnte man auch innerhalb der compare-Methode auf personen zugreifen. Der Compiler realisiert das durch eine Closure, die sich den lokalen Kontext merkt. Dabei werden alle freien Variablen kopiert und für den lesenden Zugriff zu einem späteren Zeitpunkt zur Verfügung gestellt. Der Begriff „freie Variablen“ vereinigt alle lokalen Variablen plus alle Methodenparameter des aufrufenden Kontexts. Lambda Expressions ändern an dieser Vorgehe...

Exklusives Abo-Special

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