javaのStream#map()とjsのArray#map()は実行順が違う

java8から追加されたmap
他の言語にも似た機能はありますが実行順が違うので備忘録的なメモ

javaのmap

Stream.of(1, 2, 3, 4, 5)
        .map(v -> {
            System.out.printf("%dに1を加える\n", v);
            return v + 1;
        })
        .map(v -> {
            System.out.printf("%dを2倍する\n", v);
            return v * 2;
        }).forEach(v -> System.out.println(v));

jsのmap

[1, 2, 3, 4, 5]
        .map(v => {
            console.log(`${v}に1を加える`);
            return v + 1;
        })
        .map(v => {
            console.log(`${v}を2倍する`);
            return v * 2;
        })
        .forEach(v => console.log(v));

パっと見、まったく同じに見えますが実行してみると結果が違います

javaの実行結果

1に1を加える
2を2倍する
4
2に1を加える
3を2倍する
6
3に1を加える
4を2倍する
8
4に1を加える
5を2倍する
10
5に1を加える
6を2倍する
12

jsの実行結果

1に1を加える
2に1を加える
3に1を加える
4に1を加える
5に1を加える
2を2倍する
3を2倍する
4を2倍する
5を2倍する
6を2倍する
4
6
8
10
12

結果的に生成されるリストは同じですが実行順が違います
気をつけないと間違えそうですね