Java8以降の Stream API で畳み込みを行いたい場合は Stream#reduce
か Collectors.reducing
を使用します。
しかし、Stream API は基本的に parallel で動作する事を考慮に入れる必要があるため、Stream#reduce
および Collectors.reducing
には強い制約があります。
つまり、初期値は必ず単位元である必要があり、演算は結合則を満たす必要があります。
試しにその制約を満たしていない引数を渡すと、結果が定まらない事が見て取れます。
例えば 50
という初期値から 1~100
までの数値を順番に引いていくと -5000
になるはずです。
IntStream.rangeClosed(1, 100).boxed().parallel().reduce(50, (a, b) -> a - b, (a, b) -> a + b); // -3250 になる