Stream の評価順

Streamの評価順序は、要素ひとつひとつに対して連続して行われる。
また、終端処理が実行されるまでは中間処理は実行されない。

   public static void main(String[] args) {
        
        Stream<String> stream = Stream.of("banana", "apple", "orange")
                .filter(lengthFilter)
                .peek(e -> System.out.println(e + " "))
                .map(toUpper)
                .peek(e -> System.out.println(e + " "));
        System.out.println("OK");
        stream.count(); //この終端処理が実行されるまでは上記の中間処理は実行されない
    }
    
    static Predicate<String> lengthFilter = new Predicate<String>() {
        @Override
        public boolean test(String t) {
            System.out.println("filtering...");//わかりやすいように標準出力する
            return t.length() > 5;
        }
    };
    
    static Function<String, String> toUpper = new Function<String, String>() {
        @Override
        public String apply(String t) {
            System.out.println("mappering...");
            return t.toUpperCase();
        }
    };

結果

OK
filtering...
banana 
mappering...
BANANA 
filtering...
filtering...
orange 
mappering...
ORANGE 

結果を見るとわかるように、終端処理(この例ではstream.count())がされるまでは、中間処理の内容が実行されていない。
(標準出力に「OK」が先に来ている)
また、Streamの要素一つ一つに対して処理が行われていることもわかる。

最初に、一つ目の要素(banana)に対して、filter()がかかり、map()が処理されていることが標準出力の内容から見て取れる。
また、フィルタ処理ではじかれるappleについては「filtering...」の標準出力後に最後の要素のorangeのfiltering...が出力されていることから、
マッピング処理に移らず、次の要素のフィルタリングへ移っていることもわかる。

以上。