Stream.reduce with identity 和 Stream.reduce().orElse() 的区别是按位或减少的情况

Difference in Stream.reduce with identity and Stream.reduce().orElse() is case of bit wise OR reduction

我尝试了以下两组代码,结果没有发现任何差异。我还尝试过 reduce(T identity, BinaryOperator<T> accumulator)reduce(BinaryOperator<T> accumulator) 的实现,但当累加器函数按位或时无法注意到任何区别。

long result1 = myList.stream.reduce((a,b) -> a|b).orElse(0L);
long result2 = myList.stream.reduce(0L,(a,b) -> a|b);

是否有任何极端情况会导致不同的结果,或者一个在任何方面都比另一个更好?

结果没有区别。

不过我会拆箱 Stream<Long> elements into a LongStream,这样累加器就不需要自动装箱结果了。

有了这个,我会使用第二个选项。

long result = myList.stream()
        .mapToLong(Long::longValue)
        .reduce(0L, (a, b) -> a | b);