如果仅将 BinaryOperator 参数中的一个与自身进行汇总

看看下面的代码:在二元运算符中,我们有 reduce((x,y)->x+x)。为什么实际计算为 Optional[512]?我没有解释。


System.out.println((Stream.generate(()->1d).limit(10).

            peek((doubleValue)->{

                System.out.println("Call the first peek: "+doubleValue);

            }).

            reduce((x,y)->x+x)));

这是输出:为了向您澄清,我在 peek 部分显示单个 x 为 1.0。


Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Call the first peek: 1.0

Optional[512.0]

那么问题来了,在获得 Optional[512] 之前,什么控制 reduce 工作?


慕姐4208626
浏览 126回答 3
3回答

MYYA

因为你有 10 个参数,但运算是 9。2^9 = 512

眼眸繁星

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

小唯快跑啊

让我们看看这里发生了什么:&nbsp; &nbsp; System.out.println((Stream.generate(()->1d).limit(10).&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reduce((x,y)-> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double ret = x+x;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(ret);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ret;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })));输出是2.04.08.016.032.064.0128.0256.0512.0Optional[512.0]因为您的流中有 10 个参数提供给具有默认起始值的reduce0。由于您正在使用并且实际上在@ZhenyaM 提到的第一次之后,(x, y) -> x+x结果加倍了 9 倍以上:result <- result + resultresult <- 0 + 12^9 = 512
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java