Java 8 Optional meistern: Praktischer Leitfaden für null-sicheren Code
Optional ist ein Container-Objekt, das nicht-null-Objekte aufnehmen kann. Ein Optional-Objekt dient dazu, null durch einen fehlenden Wert darzustellen. Diese Klasse bietet diverse Hilfsmethoden, um Werte als „vorhanden“ oder „nicht vorhanden“ zu behandeln, anstatt explizit auf null zu prüfen. Sie wurde in Java 8 eingeführt und ähnelt dem Optional aus Guava.
Klassendeklaration
Nachfolgend die Deklaration der Klasse java.util.Optional<T>:
public final class Optional<T> extends Object
Klassenmethoden
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | static <T> Optional<T> empty() Gibt eine leere Optional-Instanz zurück. |
| 2 | boolean equals(Object obj) Prüft, ob ein anderes Objekt „gleich“ diesem Optional ist. |
| 3 | Optional<T> filter(Predicate<? super T> predicate) Wenn ein Wert vorhanden ist und das Prädikat erfüllt, wird ein Optional mit diesem Wert zurückgegeben; andernfalls ein leeres Optional. |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) Wendet die gegebene, ein Optional liefernde Mapping-Funktion an, falls ein Wert vorhanden ist; andernfalls leeres Optional. |
| 5 | T get() Liefert den Wert, falls vorhanden; sonst wirft |
| 6 | int hashCode() Gibt den Hash-Code des vorhandenen Werts zurück, oder 0, wenn kein Wert vorhanden ist. |
| 7 | void ifPresent(Consumer<? super T> consumer) Führt den Consumer mit dem Wert aus, falls vorhanden; andernfalls nichts. |
| 8 | boolean isPresent() Gibt |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) Wendet die Mapping-Funktion an, falls ein Wert vorhanden ist, und gibt ein Optional des Ergebnisses zurück (sofern nicht null). |
| 10 | static <T> Optional<T> of(T value) Gibt ein Optional mit dem angegebenen nicht-null-Wert zurück. |
| 11 | static <T> Optional<T> ofNullable(T value) Gibt ein Optional zurück, das den Wert beschreibt, falls nicht-null; andernfalls leeres Optional. |
| 12 | T orElse(T other) Liefert den Wert, falls vorhanden; andernfalls den Standardwert |
| 13 | T orElseGet(Supplier<? extends T> other) Liefert den Wert, falls vorhanden; andernfalls ruft den Supplier auf und gibt dessen Ergebnis zurück. |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Liefert den enthaltenen Wert, falls vorhanden; andernfalls wirft eine Exception, die vom Supplier erzeugt wird. |
| 15 | String toString() Gibt eine nicht-leere String-Repräsentation für Debugging-Zwecke zurück. |
Diese Klasse erbt Methoden von:
- java.lang.Object
Optional-Beispiel
Erstellen Sie das folgende Java-Programm in einem Editor Ihrer Wahl, z. B. unter C:\JAVA.
Java8Tester.java
Live Demoimport java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable erlaubt null als Parameter
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of wirft NullPointerException bei null
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// isPresent prüft, ob ein Wert vorhanden ist
System.out.println("Erster Parameter vorhanden: " + a.isPresent());
System.out.println("Zweiter Parameter vorhanden: " + b.isPresent());
// orElse liefert Wert oder Default
Integer value1 = a.orElse(new Integer(0));
// get liefert den Wert (muss vorhanden sein)
Integer value2 = b.get();
return value1 + value2;
}
}
Ergebnis prüfen
Kompilieren mit javac:
C:\JAVA>javac Java8Tester.java
Ausführen:
C:\JAVA>java Java8Tester
Erwartete Ausgabe:
Erster Parameter vorhanden: false Zweiter Parameter vorhanden: true 10
Java
- Javas final-Schlüsselwort verstehen: Variablen, Methoden und Klassen
- Java instanceof-Operator: Ein umfassender Leitfaden
- Java statische verschachtelte Klassen verstehen: Nutzung, Unterschiede und Beispiele
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Singleton-Pattern erklärt: Sichere Implementierung und Verwendung
- Java Reflection meistern: Klassen, Methoden und Felder zur Laufzeit inspizieren
- Java ObjectOutputStream meistern: Serialisierung, Methoden und praktische Beispiele
- Java Generics meistern – Wiederverwendbaren, typsicheren Code erstellen
- Java-Dateioperationen mit java.io meistern – Erstellen, Lesen, Schreiben & Löschen
- Java 9 Optional Erweiterungen: stream(), ifPresentOrElse() & or()