Java Optional – Endlich so, wie es schon immer sein sollte

Seit Java 8 gibt es die Optional-Klasse, die mittlerweile bestimmt fast jeder schon einmal genutzt oder zumindest gesehen hat. Da in Java der Umgang mit optionalen Objekten und damit verbunden null ja leider nicht so elegant ist wie in manch anderen Sprachen, ist Optional angetreten, um genau diesen Umstand zu verbessern.

Man kann an einem Optional unter anderem

  • abfragen, ob ein Objekt wirklich vorhanden ist: boolean isPresent()
  • sich das Objekt zurückgeben lassen: T get()
  • das gesetzte Objekt oder ein alternatives Objekt zurückgeben lassen:
    T orElseGet(Supplier<? extends T> alternative)
  • oder direkt Code mit einem vorhandenen Objekt ausführen lassen:
    void ifPresent(Consumer<? super T> consumer).

Was der API gefehlt hat, war eine schöne, prägnante Lösung für den Anwendungsfall “wenn ein Objekt vorhanden ist, führe folgenden Code aus, ansonsten führe diesen alternativen Code aus”.  Mit der bisherigen API sah das Ganze nämlich immer so oder so ähnlich aus:

Optional<Item> nextItem = loadNextItem(); 
nextItem.ifPresent(Item::process); 
if(!nextItem.isPresent()) { 
    latch.countDown(); 
}

Verständlich…ja…schön…eher nein. Zumindest nicht, wenn man bedenkt, dass mit Optional ja alles besser werden sollte. Erfreulicherweise wurde die Optional API in Java 9 um folgende Methode erweitert:

void ifPresentOrElse​(Consumer<? super T> action, Runnable emptyAction).

Mit dieser Methode lässt sich oben beschriebene Anforderung elegant in einem Einzeiler folgendermaßen lösen:

loadNextItem().ifPresentOrElse(Item::process, latch::countDown);

(Codebeispiele entnommen aus https://bugs.openjdk.java.net/browse/JDK-8071670)

Short URL for this post: https://wp.me/p4nxik-3a5
This entry was posted in Java Basics and tagged , . Bookmark the permalink.

One Response to Java Optional – Endlich so, wie es schon immer sein sollte

  1. Ich verstehe, dass Optional irgendwie “cooler” ist als eine null-Prüfung. Aber folgender Code geht doch auch:

    final Optional text = getText();
    System.out.println(text.orElse(“No text”));

    final String text2 = getText2();
    System.out.println(text2 != null ? text2 : “No text”);

    Der einzige Vorteil an Optional ist IMO dass man anhand des Optional-Typs schon erkennt dass der Wert eventuell null sein könnte. Aber wirklich kürzer wird der Code nicht.

Leave a Reply