FlatMap 後の Java ストリーム フィルターが完全に遅延していない
Java ストリームは、一連の変換を通じてデータ パイプラインを処理する方法を提供します。通常、中間操作は遅延的です。つまり、最終操作が呼び出されるまで実行されません。ただし、特定のシナリオで flatMap() の後に filter() を適用すると、非遅延動作が発生する可能性があることが観察されています。
サンプル コード
次のことを考慮してください。コード:
System.out.println( "Result: " + Stream.of(1, 2, 3) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get() ); System.out.println("-----------"); System.out.println( "Result: " + Stream.of(1, 2, 3) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get() );
出力
1 Result: 1 ----------- -1 0 1 0 1 2 1 2 3 Result: -1
説明
最初のケースでは、フィルタリング操作が適用されますflatMap() の前にあるため、遅延評価が行われます。評価は最初に一致する要素 (1) で停止します。
2 番目のケースでは、 flatMap() 操作により 9 つの要素 (-1、0、1、0、1、2、1) の新しいストリームが作成されます。 、2、3)。後続の filter() 操作はこれらの各要素に適用され、遅延のない動作が行われます。一致する要素 (-1) が見つかったにもかかわらず、評価はストリーム内のすべての要素の処理を続行します。
修正
この問題は JDK-8075939 で解決されました。 Java 10 で修正されました。これは Java 8 にバックポートされました。 JDK-8225328.
この修正により、 flatMap() 操作と filter() 操作の両方が存在する場合でも遅延評価が維持されるようになります。これは、一致する要素が見つかるとすぐに評価が終了することを意味します。
影響
この修正により、次の場合に非遅延動作から発生する可能性がある問題が解決されます。 flatMap() と filter() を使用します。早期終了が予想される場合のストリーム パイプラインのパフォーマンスと正確性が向上します。
以上がJava Stream の ` flatMap()` の後の `filter()` が時々遅延を失うのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。