今回はちょっと趣向を変えて、ストリームの機能ではなく、ストリームの実装について紹介していきます。

 まず、ちょっとしたクイズです。リスト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メソッドのそれぞれでイテレーションしているように思えます。