今回はちょっと趣向を変えて、ストリームの機能ではなく、ストリームの実装について紹介していきます。
まず、ちょっとしたクイズです。リスト1のプログラムを実行すると、標準出力には何が出力されるでしょう。
StreamQuiz.zip
リスト1 ストリームクイズ
public class StreamQuiz {
public static void main(String... args) {
IntStream.rangeClosed(0, 5)
.filter(x -> {
System.out.println("filter: " + x);
return x%2 == 0;
})
.map(x -> {
System.out.println("map: " + x);
return x/2;
})
.forEach(x -> {
System.out.println("forEach: " + x);
});
}
}
IntStreamインタフェースのrangeClosedメソッドで要素が[0, 1, 2, 3, 4, 5]のストリームが生成されます。その後、filterメソッドで2で割り切れる数値をフィルタリングし、mapメソッドでその値を2で割っています。
最後にforEach文で標準出力に出力しています。ただし、filterメソッドとmapメソッドでも標準出力に出力しています。
普通に考えると、まずfilterメソッド、mapメソッド、forEachメソッドのそれぞれでイテレーションしているように思えます。