Flattening Optional Values with Stream::flatMap and Java Streams
In Java 8 stellt das Stream-Framework leistungsstarke APIs für prägnanten Code bereit. Allerdings kann es schwierig sein, bestimmte Szenarios, insbesondere wenn es um Optionals geht, prägnant auszudrücken.
Problemstellung
Stellen Sie sich ein Szenario vor, in dem Sie eine Liste von Objekten und eine Methode haben, die löst jedes Objekt in ein Optional auf. Das Ziel besteht darin, die Objekte Optionals zuzuordnen und dann den ersten nicht leeren Wert zu erhalten.
Ein einfacher Ansatz wäre die Verwendung von Things.stream().flatMap(this::resolve).findFirst(). Allerdings erfordert flatMap die Rückgabe eines Streams und Optionals fehlt eine stream()-Methode.
Mögliche Lösung
Eine Lösung beinhaltet die Verwendung eines mehrstufigen Vorgangs:
<code class="java">things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst();</code>
Obwohl dieser Ansatz funktioniert, erscheint er ziemlich ausführlich.
Verbesserte Lösungen
Java 9 und spätere Versionen bieten elegantere Lösungen:
Java 16:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .<Other>mapMulti(Optional::ifPresent) .findFirst();</code>
Java 9:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .flatMap(Optional::stream) .findFirst();</code>
Java 8 (Problemumgehung):
Vor Java 9 kann eine Hilfsfunktion eingesetzt werden:
<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) { return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty(); } Optional<Other> result = things.stream() .flatMap(t -> streamopt(resolve(t))) .findFirst();</code>
Diese erweiterten Lösungen bieten präzisere und effizientere Möglichkeiten zur Handhabung von Optionals innerhalb von Stream-Operationen.
Das obige ist der detaillierte Inhalt vonWie kann man optionale Werte mit Stream::flatMap und Java Streams reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!