当前位置: 首页 > 知识库问答 >
问题:

流reduce()需求到底需要什么?

郭志泽
2023-03-14
    null
System.out.println(
        Arrays.asList(1, 2, 3, 4, 5, 6)
                .parallelStream()
                .reduce(0, (a, b) -> (a - b)));

它可能输出-21、3或其他一些值,因为累加器函数违反了关联属性。

标识要求的示例:

System.out.println(
        Arrays.asList("w", "o", "l", "f")
                .parallelStream()
                .reduce("X", String::concat));

这本书是怎么说的:

共有1个答案

蔡鹏程
2023-03-14

为什么累加器不是关联的?

它不是关联的,因为减法运算的顺序决定了最终的结果。

如果运行串行,将得到预期的结果:

0 - 1 - 2 - 3 - 4 - 5 - 6 = -21
0 - 1   0 - 2   0 - 3      0 - 4     0 - 5    0 - 6
  -1     -2      -3         -4        -5        -6

  -1 - (-2)         -3 - (-4)          -5 - (-6)
      1                 1                  1
           1   -   1
               0            -     1

                        -1
(1 - 2) - 3 = -4
1 - (2 - 3) =  2

那么到底什么才是合适的身份呢?

如果将标识值更改为“”:

System.out.println(Arrays.asList("w","o","l","f"))
.parallelStream()
.reduce("", String::concat));

您将得到“Wolf”而不是“xwxoxlxf”。

 类似资料:
  • 问题内容: 在并行流上使用操作时,OCP考试手册指出,论点必须遵守某些原则。这些原则如下: 必须定义身份,以便对于流u中的所有元素,combiner.apply(identity,u)等于u。 累加器运算符op必须是关联且无状态的,等于。 组合器运算符还必须是关联且无状态的,并且必须与该身份兼容,以使得对于和 都等于。 本书提供了两个示例来说明这些原理,请参见下面的代码: 关联的示例: 这本书怎么

  • 问题内容: 我知道元素上的设置用于使其居中(左右)。但是,我知道该元素及其父元素必须满足某些条件才能使用自动边距,而且我似乎永远无法正确理解魔术。 所以我的问题很简单:为了使孩子左右居中,必须在元素及其父元素上设置哪些CSS属性? 问题答案: 从我的头顶上: 所述元件必须是块级,例如或 元素不能浮动 元素不得具有固定或绝对位置1 超越别人的头: 元素必须具有不为2的 请注意, 所有 这些条件都必须

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 互联网是超文本标记语言(HTML)页面的集合,它们彼此链接以形成概念性信息网络。随着时间的推移,静态资源数量增加,图像等更丰富的项目开始成为Web结构的一部分。 高级服务器技术允许动态服务器页面 - 其内容基于查询生成的页面。 很快,需要拥有更多动态网页才能获得动态超文本标记语言(DHTML)。一切都归功于JavaScript。在接下来的几年中,我们看到了跨帧通信,试图避免页面重新加载,然后在帧内

  • 当前信息时代,哪里都是应用程序。这些应用程序们不仅仅是运行人们工作场所的工具 - 它们现在正在经营人们的生活。 对即时响应的需求,完美的行为和更多的功能是前所未有的。 而且,当然,人们期望应用程序在不同类型的设备上运行平稳,特别是在移动设备上。 应用程序执行的速度与它所做的一样重要。 NGINX的核心功能,例如其具有高性能HTTP和反向代理服务器的大规模可扩展事件驱动架构,访问和带宽控制以及与各种