为了账号安全,请及时绑定邮箱和手机立即绑定

如果只有一个 BinaryOperator 参数被用自身来总结,那么 Java 流实际上会减少什么?

如果只有一个 BinaryOperator 参数被用自身来总结,那么 Java 流实际上会减少什么?

Helenr 2022-08-03 10:29:38
看看下面的代码:在二元运算符中,我们有remined((x,y)->x+x)。为什么它实际上被计算为可选[512]?我没有解释。System.out.println((Stream.generate(()->1d).limit(10).            peek((doubleValue)->{                System.out.println("Call the first peek: "+doubleValue);            }).            reduce((x,y)->x+x)));这是输出:只是为了向你澄清,我在偷看部分中显示单个x是1.0。Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Call the first peek: 1.0Optional[512.0]那么问题来了,在获得Optimal[512]之前,什么控制着减少到工作?爪哇岛java-stream
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

因为您有 10 个参数,但操作是 9。2^9 = 512


查看完整回答
反对 回复 2022-08-03
?
白板的微信

TA贡献1883条经验 获得超3个赞

从技术上讲,当您这样做时,Stream reduce不会提供任何一致的事情。

保证仅通过关联约化操作提供,而您的保证则不然(它考虑了第一个操作数,忽略了第二个操作数。

测试代码时,会观察结果。

当试图对如何在非并行流中实现减少进行有根据的猜测时,这些结果并不令人惊讶。但是,Stream的文档无法保证这些结果,因为您没有遵守要求。

例如,结果可能是 1 或 2。虽然有点令人费解,但它仍然有意义,你是那个不符合要求的人。


查看完整回答
反对 回复 2022-08-03
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

让我们看看这里发生了什么:


    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 个参数提供给具有默认起始值的 reduce。0


由于您正在使用并且您实际上将结果加倍9倍,例如在第一个之后,@ZhenyaM提到:(x, y) -> x+xresult <- result + resultresult <- 0 + 12^9 = 512


查看完整回答
反对 回复 2022-08-03
  • 3 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信