Java 8 – Optionals

Optionals ist eine mit Java 8 eingeführte Wrapper-Klasse. Ein generischer Containertyp, der genau eine Variable von beliebigem Typ aufnimmt und für die Abfrage, die Initialisierung oder den Status Methoden zur Verfügung stellt, um mit dem enthaltenen – oder eben auch nicht enthaltenen – ‚Wert‘ einer Variablen umzugehen. Und wie geht ein Optional mit dieser Unklarheit um? Es zwingt den Aufrufenden (Caller) einer Methode dazu, sich explizit mit der Möglichkeit einen Null-Wert zurückzubekommen. Und wie? Indem es seinen enthaltenen Wert nur durch die Verwendung der mitgelieferten Methoden hergibt, doch dazu am Beispiel mehr.

Hier möchte ich nur kurz auf einige Funktionen eingehen, Beispiele dazu gibt es in dem Codebeispiel im Git-Repository:

  • Optional<T>.of(<T>) –> erstellt ein Optional mit dem angegebenen Wert, der nicht null sein darf
  • Optional<T>.ofNullable() –> erstellt ein Optional, wobei der angegebene Wert null sein darf
  • Optional<T>.get() –>gibt den Wert zurück, kann zu einer NullPointerException führen
  • Optional<T>.orElse(<T>) –> wenn der Wert nicht vorhanden ist, gibt es den Methodenparameter zurück
  • Optional<T>.orElseThrow(() -> new Exception()) –> ist ein Wert nicht vorhanden, kann mit einer Supplierfunktion eine Exception geworfen werden
  • Optional<T>.ifPresent(Consumer<T>) –> Wenn ein Wert vorhanden ist, wird der Consumer ausgeführt, sonst nicht
  • Optional<T>.isPresent –> liefert einen boolschen Wert zurück, der angibt, ob ein Wert vorhanden ist oder nicht
  • Optional<T>.map() –> Anwendung der angegebenen Funktion auf den Wert, wenn er angegeben ist
  • Optional<T>.filter().ifPresent(Consumer<T>) –> Filter den Wert eines Optionals und wendet anschließend, sofern der Wert noch vorhanden ist, auf das Optional eine Funktion an

Optionals sind value-based classes, die Werte sind also implizit immutable und final.