Java 8 Stream.iterateの例
Java 8では、「Stream.iterate」を使用して、必要に応じてストリーム値を作成することができます。これは、無限ストリームと呼ばれます。
1. Stream.iterate
1.1 0〜9のストリーム
//Stream.iterate(initial value, next value) Stream.iterate(0, n -> n + 1) .limit(10) .forEach(x -> System.out.println(x));
出力
0 1 2 3 4 5 6 7 8 9
1.2奇数のストリームのみ。
Stream.iterate(0, n -> n + 1) .filter(x -> x % 2 != 0)//odd .limit(10) .forEach(x -> System.out.println(x));
出力
1 3 5 7 9 11 13 15 17 19
1.3古典的なフィボナッチの例。
Stream.iterate(new int[]{0, 1}, n -> new int[]{n[1], n[0]+ n[1]}) .limit(20) .map(n -> n[0]) .forEach(x -> System.out.println(x));
出力
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
1.4すべてのフィボナッチ値を合計する。
int sum = Stream.iterate(new int[]{0, 1}, n -> new int[]{n[1], n[0]+ n[1]}) .limit(10) .map(n -> n[0])//Stream<Integer> .mapToInt(n -> n) .sum(); System.out.println("Fibonacci 10 sum : " + sum);
出力
Fibonacci 10 sum : 88
2. Java 9
stream.iterate`はJava 9で拡張されました。これは第2引数として述語(条件)をサポートし、述語が偽であれば
stream.iterate`は停止します。
2.1 `n> = 20`ならストリームの反復を止める
Stream.iterate(1, n -> n < 20 , n -> n ** 2) .forEach(x -> System.out.println(x));
出力
1 2 4 8 16
参考文献
doc – Javaストリーム反復]