ホームページ >Java >&#&チュートリアル >Java でオプションをストリームにフラット化する方法

Java でオプションをストリームにフラット化する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 04:16:30326ブラウズ

How to Flatten Optionals into a Stream in Java

Stream:: flatMap を使用した Java 8 のオプションの使用法

Stream:: flatMap は、複数のストリームを 1 つのストリームに結合するための Java 8 の強力なツールです。ただし、ストリームを返す必要があるため、Optional を処理するときに問題が発生する可能性があります。

問題

List がある状況を考えてみましょう。そして各 Thing を Optional にマッピングするメソッド。 Things を Optional にマッピングし、空ではない最初の Optional を取得したいと考えています。

Stream:: flatMap と Optional::findFirst を使用した単純なアプローチは、Optional が stream() を提供しないため失敗します。メソッド:

<code class="java">things.stream().flatMap(this::resolve).findFirst(); // Error!</code>

ソリューション

Java 16 以降

Java 16 では Stream.mapMulti が導入され、Optional をストリームにマッピングできるようになりました。空ではない要素:

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .<Other>mapMulti(Optional::ifPresent)
          .findFirst();</code>

Java 9

Java 9 では、空ではない Optional 値のストリームを直接返す Optional.stream が追加されました:

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();</code>

Java 8

Java 8 の場合、ヘルパー関数を使用してオプションをストリームに変換できます。

<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) {
    if (opt.isPresent())
        return Stream.of(opt.get());
    else
        return Stream.empty();
}</code>

使用このヘルパー関数の場合、解決策は次のようになります:

<code class="java">Optional<Other> result =
    things.stream()
          .flatMap(t -> streamopt(resolve(t)))
          .findFirst();</code>

以上がJava でオプションをストリームにフラット化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。