Oracle

Java 8 mit Lambda-Ausdrücken ist fertig

Thomas Cloer war viele Jahre lang verantwortlich für die Nachrichten auf computerwoche.de.
Er sorgt außerdem ziemlich rund um die Uhr bei Twitter dafür, dass niemand Weltbewegendes verpasst, treibt sich auch sonst im Social Web herum (auch wieder bei Facebook) und bloggt auf teezeh.de. Apple-affin, bei Smartphones polymorph-pervers.
Mit erneut deutlicher Verspätung hat Oracle die neue Java-Version 8 freigegeben.

Das entsprechende JDK (Java Development Kit) 8 von Oracle und die korrespondierende freie Implementierung OpenJDK 8 basieren auf der Java Standard Edition 8, die der Java Community Process (JCP) festgelegt hat.

Foto: Oracle

Die mit Abstand wichtigste Neuerung in Java 8 sind die sogenannten Lambda-Funktionen. Damit lassen sich anonyme Klassen mit einer Methode kompakter schreiben. Das soll nicht nur lesbareren Code, sondern auch besser parallelisierbare Algorithmen ermöglichen. Lambda-Ausdrücke sind unter Einfluss funktionalerer Sprachen wie Scala entstanden; die Syntax erinnert dabei stark an die von C#.

Lambda-Ausdrücke können kann direkt auf Variablen zugreifen, die in derselben Codeebene zugänglich sind, in der sie definiert werden ("Variable Capture"); Dazu müssen lokale Variablen allerdings final deklariert sein oder sich zumindest so verhalten. Zwecks Abwärtskompatibilität lassen sich bei der Definition von Schnittstellen einzelne Methoden mit dem Schlüsselwort "default" deklarieren und mit Code versehen; der Programmierer kann dann wahlweise die Default-Implementierung übernehmen oder mit eigenem, gegebenenfalls effizienterem Code überschreiben.

Ganz neue Möglichkeiten eröffnen Lambda-Ausdrücke beim Umgang mit Aufzählungen. Die im Paket java.util.stream versteckte Schnittstelle Stream<T> erweitert die grundlegenden Aufzählungsklassen um ein vollkommen neues Konzept - die Elemente werden dabei nicht gespeichert, sondern von einer Methode an die nächste weitergereicht (vergleichbar mit den Pipes von Unix/Linux) und erst bei Bedarf tatsächlich verarbeitet ("Lazy Operation"). Wichtige Methoden sind filter, map, reduce, fold, limit sowie skip.

Mit dem Projekt Threeten versucht die Java-Community einmal mehr, die bislang unzureichenden und unübersichtlichen Datums- und Zeitklassen zu vereinfachen. Auf Basis von Joda-Time ist dabei allerdings eine weitere Bibliothek entstanden, die inkompatibel zu allen bisherigen Varianten und mit über 60 Klassen und Schnittstellen in mehreren Paketen alles andere als übersichtlich ist. Java 8 unterscheidet außerdem künftig zwischen einer "Machine Time Line" für Berechnungen und einer "Human Time Line" für Uhrzeiten und Datum in lesbarer Form.

Weitere Neuerungen in Java 8 sind Annotationen von Metainformationen für alle Java-Typen. Eine Annotation lässt sich nun mehrfach auf ein Element anwenden; in der Liste der vordefinierten Annotationen gibt es neu @FunctionalInterface zur Kennzeichnung funktionaler Schnittstellen. Die Server-seitig gelegentlich eingesetzte JavaScript-Engine Rhino wurde durch die neue Implementierung Nashorn ersetzt, die JavaScript deutlich schneller ausführen und gleichzeitig weniger Ressourcen fressen soll.

Auf eine echte Modularisierung von Java müssen Entwickler aber weiter bis mindestens zur Version 9 warten (wann und mit welchen Features diese erscheinen wird, steht heute noch in den Sternen). Das eigentlich schon für Java 7 (2011) geplante Projekt Jigsaw soll es ermöglichen, Java-Programme mit einer minimalen Runtime-Umgebung mit nur den tatsächlich genutzten Klassen auszuliefern. Als Zwischen-Notlösung kommt Java 8 mit vordefinierten Profilen ("Compact1" bis "Compact3") mit unterschiedliche Subsets des JDK 8 für den Einsatz auf Geräten mit begrenzter Hardware. Das Framework JavaFX ist mit dem JDK 8 auch Teil des OpenJDK. Es kommt mit überarbeiteter Dokumentation, neuem Theme, neuen Controls, Änderungen in der API und weiteren Neuerungen.

Am 25. März will Oracle die Neuerungen in Java 8 in einem Webcast ausführlicher vorstellen und diskutieren.