Für eine kleine Ewigkeit

Java 11 – eine Einführung: Erweiterungen in den Klassen Optional, Predicate & TimeUnit

Michael Inden

© Shutterstock / Profit_Image

Java 11 steht seit Ende September 2018 zum Download bereit und stellt nach Java 8 wieder ein sogenanntes LTS-Release (Long Time Support) dar. Das ist insofern erfreulich, da hier einige Jahre Support und Updates angeboten werden, wohingegen Java 9 und 10 durch die neue Release-Politik von Oracle jeweils lediglich für eine kurze Zeitspanne von 6 Monaten aktuell waren und auch keine Updates mehr erhalten. In seiner neuen Serie zu Java 11 gibt Michael Inden einen Einblick in die Features der neuen Java-Version.

Michael Inden hat bereits die Highlights von Java 9 in seiner Artikelserie Java 9 – Eine Einführung vorgestellt, in der Serie Best of Java 10 ging er auf die Neuerungen in Java 10 ein. Die vorliegende Artikelserie setzt sich aus Texten zusammen, die auch Teil seines neuen Buches zu Java 10/11 sein werden, das beim dpunkt.verlag erscheinen wird.

Im vorherigen Teil der Serie ging es um die Neuerungen in diversen APIs von Java 11, insbesondere um neuen Methoden in der Klasse java.lang.String. Zudem zeigte ich verschiedene Convenience-Funktionalitäten, als erstes in der Utility-Klasse java.nio.file.Files. Im vorliegenden Serienteil stelle ich eine kleinere Erweiterung in der Klasse java.util.Optional<T> vor. Eine solche findet sich auch in den Klassen java.util.function.Predicate<T> sowie in java.util.concurrent.Time-Unit. Beide Neuerungen behandle ich in separaten Abschnitten. Im nächsten Teil stelle ich das HTTP/2-API vor, das mit Java 11 den Incubator-Status verlassen hat und zum vollwertigen API in das JDK aufgenommen wurde.

Erweiterung in der Klasse Optional

Wie schon im Text zu Java 10 erwähnt, stellt die Klasse java.util.Optional<T> eine enorme Bereicherung des JDKs in Java 8 dar. Sowohl in Java 9 als auch Java 10 wurde das API noch ein wenig klarer gestaltet. Schließlich wird nun in Java 11 mit isEmpty() eine weitere Methode ergänzt. Diese bringt mehr Konsistenz zu anderen APIs wie denjenigen von Collection und String. Die Methode isEmpty() liefert ihrem Namen konform true, falls kein Wert in Optional<T> enthalten ist, und ansonsten false. Die Verbesserung in der Lesbarkeit des Source Codes durch Verzicht der Negation verdeutlicht folgendes Beispiel:

final Optional<String> optEmpty = Optional.empty();

if (!optEmpty.isPresent())
    System.out.println("check for empty JDK 10 style");

if (optEmpty.isEmpty())
    System.out.println("check for empty JDK 11 style");

Erweiterung in der Klasse Predicate

Die Klasse java.util.function.Predicate<T> ist seit Java 8 sehr nützlich, um Filterbedingungen für die Stream-Verarbeitung definieren zu können. Neben der Verknüpfung mit and() und or() ließ sich eine Negation per negate() ausdrücken. Das war etwas umständlich und schwieriger lesbar, wie es folgendes Beispiel zeigt:

// JDK 10 style
final Predicate isEmpty = String::isEmpty;
final Predicate notEmptyJdk10 = isEmpty.negate();

Zur Vereinfachung hätte man sich eine Methode not() gewünscht. Java 11 bietet eine solche, die sich wie folgt einsetzen lässt:

// JDK 11 style
final Predicate notEmptyJdk11 = Predicate.not(String::isEmpty);

Um die Lesbarkeit zu erhöhen, empfiehlt sich deren statischer Import:

import static java.util.function.Predicate.not;

Dann kann man die Negation folgendermaßen prägnanter schreiben:

final Predicate notEmptyJdk11 = not(String::isEmpty);

In nutzenden Applikationen führt dies zu einer deutlichen Steigerung der Lesbarkeit. Man beachte außerdem, dass man im einführenden Beispiel eine künstliche, sogenannte Explaining Variable einführen musste, damit man eine Negation vornehmen konnte. Das ist mit Java 11 nicht mehr nötig.

Erweiterung in der Klasse TimeUnit

Die Klasse java.util.concurrent.TimeUnit wurde erweitert und besitzt nun die Methode convert(Duration), die eine Umwandlung der durch TimeUnit repräsentierten Zeiteinheit in eine solche aus dem mit Java 9 eingeführten Date and Time API ermöglicht:

final TimeUnit days = TimeUnit.DAYS;

System.out.println(days.convert(Duration.ofDays(7)));
System.out.println(days.convert((Duration.ofHours(72)));
System.out.println(days.convert((Duration.ofHours(42)));

Das obige Programmfragment produziert folgende Ausgaben, die zeigen, dass die drei Aufrufe erwartungskonfrom die Zeitspannen in Tagen bzw. Stunden korrespondierend umwandeln:

7
3
1

 

Im nächsten Teil geht es dann um das HTTP/2-API!

Der Weg zum Java-Profi

Michael Indens Buch bietet eine umfassende Einführung in die professionelle Java-Entwicklung und vermittelt Ihnen das notwendige Wissen, um stabile und erweiterbare Softwaresysteme auf Java-SE-Basis zu bauen. Praxisnahe Beispiele helfen dabei, das Gelernte rasch umzusetzen. Neben der Praxis wird viel Wert auf das Verständnis zugrunde liegender Konzepte gelegt.

Die Neuauflage wurde durchgehend überarbeitet, aktualisiert und erweitert. Auch Java 9 sind zwei Kapitel gewidmet. Eine neue Auflage des Buches mit Erweiterungen für aktuellere Java-Versionen ist für den Sommer bzw. Herbst 2019 geplant.

Weitere Informationenen zum Buch gibt es hier!

Geschrieben von
Michael Inden
Michael Inden
Dipl.-Inform. Michael Inden ist Oracle-zertifizierter Java-Entwickler für JDK 6. Nach seinem Studium in Oldenburg war er lange Zeit als Softwareentwickler und -architekt bei verschiedenen internationalen Firmen tätig und arbeitet derzeit als Teamleiter Softwareentwicklung in Zürich. Michael Inden hat rund 20 Jahre Erfahrung beim Entwurf komplexer Softwaresysteme gesammelt, an diversen Fortbildungen und an mehreren Java-One-Konferenzen in San Francisco teilgenommen. Sein Wissen gibt er gerne als Trainer in Schulungen und auf Konferenzen weiter. Sein besonderes Interesse gilt dem Design qualitativ hochwertiger Applikationen mit ergonomischen, grafischen Oberflächen sowie dem Coaching von Kollegen.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: