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 になる