web-dev-qa-db-ja.com

Java 8と11の間のストリームの違い

このコードを考えてみましょう:

public static void main(String[] args) {
    Stream.iterate(1, i -> i + 1)
            .flatMap(i -> Stream.of(i, i, i))
            .peek(System.out::println)
            .limit(4)
            .forEach(i -> {});
}

Java 8の出力:

1
1
1
2
2
2

そしてJava 11:

1
1
1
2

これはバグか、Java 8での11で変更された8での意図された動作ですか?)

上記のコードはさまざまな動作を示すための例にすぎませんが、次のコードはJava 11に1,2,3を出力しますが、無限ループに入ります。 Java 8:

    Stream.iterate(0, i -> i + 10)
            .flatMap(i -> Stream.iterate(i + 1, j -> j + 1))
            .limit(3)
            .forEach(System.out::println);
16

flatMapの場合は遅延が変更され、Java-10まではflatMapが遅延することはありませんでした。参照 JDK-8075939

6
Eugene

Stream.flatMap( )は、端末操作の短絡を解除します -

Java 10から修正されたバグです。

9

これはバグではなく、遅延モードでflatMapを動作させるための最適化です。

ほぼ完全にサポートしているflatMapをレイジーな方法で使用できるようになったので、私が見ることができる美しい機能改善の1つ機能構成ではなく関数実行のチェーン(怠惰でない場合

機能的な構成は、執筆を開始するときに毎日本当にワクワクするものです[〜#〜] new [〜#〜] = Javaコード。

多分私はパーティーに遅れる.. !! :P

1
miiiii