Java 8: Features und Änderungen im neuen Java
Java 8, das im September 2013 erscheinen soll, bietet zahlreiche neue Features, diverse Änderungen und kleinere Neuerungen im Detail. Dieser Artikel soll eine grobe Übersicht über die Features und Änderungen in Java 8 geben. TechEmpower hat hierzu eine detaillierte Liste aller Java 8 Features und Änderungen ausgearbeitet, die ich auf wesentliche Features gekürzt habe.
Interface-Verbesserungen
Interfaces können in Java 8 nun statische Methoden definieren. Bisher mussten Interfaces aus Libraries stets eine Utility-Klasse mit sich bringen, um eine Grundfunktionalität anbieten zu können. Diese an Interfaces gebundene Utility-Klassen sind fortan aber überflüssig, da die statischen Methoden nun direkt in den Interfaces implementiert werden können, um auf diesen zu arbeiten. Sie müssen nicht mehr in eine extra Utility-Klasse ausgelagert werden.
Weiterhin können in Interfaces nun default-Methoden implementiert werden. Dies wurde auch in vielen Klassen der Java-Standard-Packages direkt umgesetzt. Die Methoden override, equals, hashCode und toString können jedoch nicht überschrieben werden, da diese von Object bereits implementiert werden.
Funktionale Interfaces
Eine weitere grundlegende Änderung in Java 8 sind funktionale Interfaces. Funktionale Interfaces sind Interfaces, die genau eine abstrakte Methode definieren. Ein Beispiel hierfür ist java.lang.Runnable, da nur eine abstrakte Methode definiert wird:
public abstract void run();
Hierzu wurde die Annotation @FunctionalInterface eingeführt, die eine Nutzung als funktionales Interface erzwingt.
Lambdas
Weitere Neuerung in Java 8 sind Lambdas, die mittels funktionalen Interfaces deklariert werden können. Zum Beispiel kann ein Lambda folgendermaßen aussehen:
(int x, int y) -> { return x + y; }
java.util.function
Neben der Umsetzung von Lambdas in bereits existierenden funktionalen Interfaces, existieren auch neue und womöglich sehr nützliche funktionale Interfaces. Sie wurden im neuen Paket java.util.function untergebracht. Folgende Interfaces stehen also ab Java 8 in diesem Paket zur Verfügung:
-
Function
– T als Eingabe, R als Rückgabe -
Predicate
– T als Eingabe, boolean als Rückgabe -
Consumer
– T als Eingabe(, Berechnung auf der Eingabe), keine Rückgabe -
Supplier
– keine Eingabe, T als Rückgabe -
BinaryOperator
– Zwei T als Eingabe, Rückgabe eines Ts
Inferenz-Verbesserungen bei generischen Typen
In manchen Fällen wusste der Java-Compiler bisher nicht, was er mit generischen Typen anfangen sollte. Dann musste ein „Typ-Zeuge“ eingesetzt werden um zu verhindern, dass der Compiler auf Object als generischen Typ zurückfällt:
// In Java 7: foo(Utility<Type>.bar()); Utility.<Type>foo().bar();
Durch Verbesserung der generischen Typen kann der Compiler in Java 8 nun viel häufiger aus dem Context auf den generischen Typ schließen:
// In Java 8: foo(Utility.bar()); Utility.foo().bar();
Dieses Java 8 Feature wird vielen Entwicklern den Umgang mit generischen Typen erleichtern.
java.time
Auch java.time enthält in Java 8 deutliche Neuerungen. Es werden nun für Monate und Wochentag Enums statt Integer genutzt. Weiterhin sind große Teile der API unveränderbar, was verhindern soll, dass Date-Felder versehentlich außerhalb der Klasse geändert werden können.
Weitere Java 8-Features und -Änderungen
- Komplett neues java.util.stream-Paket
- Collections API Erweiterungen
- Concurrency API Erweiterungen
- IO/NIO API Erweiterungen
- Änderungen an Reflections und Annotation
- Nashorn JavaScript Engine
- Diverse Änderungen an java.lang, java.util, and java.sql
Quelle: Sehr umfangreiche Übersicht wirklich aller Java 8-Features und -Änderungen von TechEmpower.