Was Entwickler mit Java 8 erwartet

Nach vielen Verzögerungen ist Java 8 nun Feature-komplett und befindet sich auf der (ziemlich langen) Zielgeraden. Außer den lang erwarteten Lambda-Ausdrücken, bringt die neue Version viele Detailverbesserungen und neue Bibliotheken.

In Pocket speichern vorlesen Druckansicht 45 Kommentare lesen
Lesezeit: 19 Min.
Von
  • Michael Kofler
Inhaltsverzeichnis

Nach vielen Verzögerungen ist Java 8 nun Feature-komplett und befindet sich auf der (ziemlich langen) Zielgeraden. Voraussichtlich im März 2014 wird die neue Version mit der Unterstützung von Lambda-Ausdrücken in die Java-Geschichte eingehen. Lambda-Ausdrücke versprechen nicht nur klareren Code, sondern auch besser parallelisierbare Algorithmen. Daneben überzeugt Java 8 durch viele Detailverbesserungen und neue Bibliotheken.

Lambda-Ausdrücke sind eine kompakte Schreibweise zur Formulierung einer anonymen Klasse mit einer Methode. Solche Klassen werden häufig benötigt, um funktionale Schnittstellen zu implementieren, also Schnittstellen, die die Signatur exakt einer Methode definieren. In der Java-Klassenbibliothek gibt es eine Menge derartiger Interfaces und entsprechend viele Anwendungsmöglichkeiten für Lambda-Ausdrücke.

Der folgende Codeausschnitt zeigt, wie Lambda-Ausdrücke typischen Java-Code vereinfachen
können: Ein FilenameFilter soll alle PDF-Dateien eines Verzeichnisses ermitteln. Seine Implementierung gelingt mit einem Lambda-Ausdruck wesentlich eleganter als mit einer herkömmlichen anonymen Klasse.

// anonyme Klasse vs. Lambda-Ausdruck
import java.io.*;
...
File basedir = new File(System.getProperty("user.dir"));

// FilenameFilter als anonyme Klasse implementieren (Java 7)
FilenameFilter pf = new FilenameFilter() {
public boolean accept(File f, String s) {
return s.toLowerCase().endsWith(".pdf");
}
};

// FilenameFilter als Lambda-Ausdruck implementieren (Java 8)
FilenameFilter pf =
(f, s) -> s.toLowerCase().endsWith(".pdf");

// FilenameFilter verwenden
File[] pdfs = basedir.listFiles(pf);
for(File f : pdfs)
System.out.println(f.getName());

Die Java-Syntax für Lambda-Ausdrücke hat große Ähnlichkeit mit der von C#, wo solche Ausdrücke schon länger erlaubt sind: Einer Parameterliste in runden Klammern folgt ein Pfeiloperator und ein Ausdruck, der die Parameter verarbeitet.

Ein Lambda-Ausdruck kann auch aus mehreren Java-Kommandos bestehen. In diesem Fall ist er in geschweifte Klammern zu setzen. Wenn der Ausdruck ein Ergebnis liefert, muss es wie bei einer Methode mit return zurückgegeben werden.

// Lambda-Ausdruck ohne Parameter
() -> 7;
() -> "Ergebnis";

// Lambda-Ausdruck mit einem Parameter
(int i) -> i*i;
(i) -> i*i;
i -> i*i;

// Lambda-Ausdruck mit mehreren Parametern
(int i, String s) -> s.substring(i, i+1);
(i, s) -> s.substring(i, i+1);

// mehrteiliger Lambda-Ausdruck
(i, s) -> { kommando1;
kommando2;
return ergebnis; }

In den meisten Fällen kann der Java-Compiler aus dem Kontext den Datentyp der Parameter eines Lambda-Ausdrucks erkennen; dann ist es nicht erforderlich, eine Typbezeichnung voranzustellen. So war im ersten Codebeispiel die Variable pf als FilenameFilter definiert; damit ist für den Java-Compiler klar, dass der Lambda-Ausdruck für die Methode accept gilt, also für die einzige Methode der FilenameFilter- Schnittstelle. Die Datentypen der Parameter f und s gehen daher aus der Signatur der Methode accept hervor. So viel Compiler-Intelligenz ist übrigens kein Novum in Java: Der in Java 7 eingeführte Diamond-Operator <> zum typenlosen Aufruf des Konstruktors einer generischen Klasse agiert ähnlich.