Heim  >  Artikel  >  Java  >  So reduzieren Sie optionale Elemente in einen Stream in Java

So reduzieren Sie optionale Elemente in einen Stream in Java

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 04:16:30244Durchsuche

How to Flatten Optionals into a Stream in Java

Optionale Verwendung von Java 8 mit Stream::flatMap

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.

Problem

Stellen Sie sich eine Situation vor, in der wir eine Liste haben. und eine Methode, die jedes Ding einem optionalen zuordnet. Wir möchten die Dinge auf Optionals abbilden und dann das erste nicht leere Optional abrufen.

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>

Lösung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn