Java 9 Optional Erweiterungen: stream(), ifPresentOrElse() & or()
Drei neue Methoden für java.util.Optional<T>
Java 8 führte Optional ein, um null explizit zu modellieren. Java 9 schließt drei Lücken.
1. stream() – Optional → Stream
public Stream<T> stream()
- Enthält Wert → Stream mit einem Element.
- Leer → leerer Stream.
- Ermöglicht nahtlose Integration in Stream-Pipelines via
flatMap.
Beispiel: Liste von Optionals filtern
List<Optional<String>> opts = List.of(
Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B")
);
// Java 8: umständlich
List<String> java8 = opts.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
// Java 9: elegant
List<String> java9 = opts.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
// Beide: [A, B]
2. ifPresentOrElse(Consumer, Runnable)
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
- Wert vorhanden →
actionmit Wert ausführen. - Leer →
emptyActionausführen. - Vermeidet
if (opt.isPresent()) ... else ...Blöcke.
Beispiel
Optional<Integer> opt = Optional.of(42);
opt.ifPresentOrElse(
v -> System.out.println("Wert: " + v),
() -> System.out.println("Nicht vorhanden")
); // Ausgabe: Wert: 42
opt = Optional.empty();
opt.ifPresentOrElse(
v -> System.out.println("Wert: " + v),
() -> System.out.println("Nicht vorhanden")
); // Ausgabe: Nicht vorhanden
3. or(Supplier<Optional>) – Fallback-Optional
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
- Wert vorhanden → gibt
thiszurück. - Leer → liefert
supplier.get()(ein anderesOptional). - Unterschied zu
orElse/orElseGet: LiefertOptional, nicht den Wert direkt – erlaubt weitere Optional-Operationen.
Beispiel
Supplier<Optional<String>> fallback = () -> Optional.of("Default");
Optional<String> opt1 = Optional.of("Echt");
opt1 = opt1.or(fallback);
opt1.ifPresent(System.out::println); // Echt
Optional<String> opt2 = Optional.empty();
opt2 = opt2.or(fallback);
opt2.ifPresent(System.out::println); // Default
Zusammenfassung
| Methode | Rückgabe | Use Case |
|---|---|---|
stream() |
Stream<T> |
Optional in Stream-Pipeline einbinden (flatMap) |
ifPresentOrElse(c, r) |
void |
Beidseitige Behandlung (Wert / Leer) als Statement |
or(supplier) |
Optional<T> |
Fallback-Optional ketten, weitere Optional-Ops möglich |
Fazit
Diese Methoden machen Optional zu einem First-Class-Citizen in Stream-Pipelines und reduzieren imperativen Kontrollfluss. Besonders flatMap(Optional::stream) ist ein häufiges Pattern in modernem Java-Code.
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 Stream API Erweiterungen: takeWhile, dropWhile, iterate & ofNullable