ホームページ >Java >&#&チュートリアル >Stream:: flatMap と Java Streams を使用してオプションの値を平坦化する方法

Stream:: flatMap と Java Streams を使用してオプションの値を平坦化する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-23 16:35:02474ブラウズ

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

Stream:: flatMap と Java Streams を使用したオプションの値の平坦化

Java 8 では、Stream フレームワークが簡潔なコード用の強力な API を提供します。ただし、特定のシナリオ、特にオプションが関係するシナリオでは、簡潔に表現するのが難しい場合があります。

問題ステートメント

オブジェクトのリストとメソッドがあるシナリオを考えてみましょう。各オブジェクトをオプションに解決します。目標は、オブジェクトを Optionals にマップし、最初の空でない値を取得することです。

簡単なアプローチは、things.stream(). flatMap(this::resolve).findFirst() を使用することです。ただし、 flatMap にはストリームを返す必要があり、Optional には stream() メソッドがありません。

考えられる解決策

解決策の 1 つは、複数ステップの操作を使用することです。

<code class="java">things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();</code>

このアプローチは機能しますが、かなり冗長に見えます。

改善されたソリューション

Java 9 以降のバージョンでは、より洗練されたソリューションが提供されます。

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 (回避策):

Java 9 より前では、ヘルパー関数を使用できます。

<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>

これらの拡張されたソリューションにより、ストリーム操作内でオプションを処理するためのより簡潔かつ効率的な方法が提供されます。

以上がStream:: flatMap と Java Streams を使用してオプションの値を平坦化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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