Stream::flatMap ist ein leistungsstarkes Tool in Java 8 zum Kombinieren mehrerer Streams zu einem einzigen Stream. Es erfordert jedoch die Rückgabe eines Streams, was beim Umgang mit Optionals problematisch sein kann.
Stellen Sie sich eine Situation vor, in der wir eine Liste
Ein naiver Ansatz mit Stream::flatMap und Optional::findFirst würde fehlschlagen, da Optionals keinen stream() bereitstellen Methode:
<code class="java">things.stream().flatMap(this::resolve).findFirst(); // Error!</code>
Java 16 und höher
Java 16 führte Stream.mapMulti ein, das die Zuordnung eines Optionals zu einem Stream von ermöglicht seine nicht leeren Elemente:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .<Other>mapMulti(Optional::ifPresent) .findFirst();</code>
Java 9
Java 9 hat Optional.stream hinzugefügt, das direkt einen Stream des nicht leeren optionalen Werts zurückgibt:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .flatMap(Optional::stream) .findFirst();</code>
Java 8
Für Java 8 können wir eine Hilfsfunktion verwenden, um ein Optional in einen Stream umzuwandeln:
<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) { if (opt.isPresent()) return Stream.of(opt.get()); else return Stream.empty(); }</code>
Using Mit dieser Hilfsfunktion lautet die Lösung:
<code class="java">Optional<Other> result = things.stream() .flatMap(t -> streamopt(resolve(t))) .findFirst();</code>
Das obige ist der detaillierte Inhalt vonSo reduzieren Sie optionale Elemente in einen Stream in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!