このコードを考えてみましょう:
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);
flatMap
の場合は遅延が変更され、Java-10まではflatMap
が遅延することはありませんでした。参照 JDK-8075939
Stream.flatMap( )
は、端末操作の短絡を解除します -
Java 10から修正されたバグです。
これはバグではなく、遅延モードでflatMap
を動作させるための最適化です。
ほぼ完全にサポートしているflatMap
をレイジーな方法で使用できるようになったので、私が見ることができる美しい機能改善の1つ機能構成ではなく関数実行のチェーン(怠惰でない場合)
機能的な構成は、執筆を開始するときに毎日本当にワクワクするものです[〜#〜] new [〜#〜] = Javaコード。
多分私はパーティーに遅れる.. !! :P