Heim  >  Artikel  >  Java  >  Wie kann man optionale Werte mit Stream::flatMap und Java Streams reduzieren?

Wie kann man optionale Werte mit Stream::flatMap und Java Streams reduzieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-23 16:35:02392Durchsuche

How to Flatten Optional Values with Stream::flatMap and Java Streams?

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!

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