3 回答

TA贡献1873条经验 获得超9个赞
从技术上讲,当您这样做时,Stream reduce 不会提供任何一致的操作。
保证仅在关联归约操作中提供,而您的则不是(它考虑了第一个操作数并忽略了第二个操作数。)
测试代码时,您正在观察结果。
当试图对如何在非并行流中实现缩减进行有根据的猜测时,这些结果丝毫不令人惊讶。但是,Stream 的文档无法保证这些结果,因为您没有遵守要求。
例如,结果可能是 1 或 2。虽然有点令人费解,但它仍然是有道理的,而你是不符合要求的人。

TA贡献1863条经验 获得超2个赞
让我们看看这里发生了什么:
System.out.println((Stream.generate(()->1d).limit(10).
reduce((x,y)-> {
double ret = x+x;
System.out.println(ret);
return ret;
})));
输出是
2.0
4.0
8.0
16.0
32.0
64.0
128.0
256.0
512.0
Optional[512.0]
因为您的流中有 10 个参数提供给具有默认起始值的reduce0。
由于您正在使用并且实际上在@ZhenyaM 提到的第一次之后,(x, y) -> x+x结果加倍了 9 倍以上:result <- result + resultresult <- 0 + 12^9 = 512
添加回答
举报