为什么以可变对象作为身份在并行流中调用reduce方法不会保留结果中的顺序?

2023-12-06

有以下看似“正确”的代码:

List<String> list = Arrays.asList("1","2","3","4","5","6",
    "7","8","9","10","11","12");
String result = list.parallelStream()
   .reduce(new StringBuilder(), StringBuilder::append, 
       StringBuilder::append).toString();
System.out.println(result);

The problem of this snippet is that the identity, new StringBuilder(), in the reduce method call is mutable, thus the result is undermined, i.e. the order of the result does not preserve. But I cannot fully understand the reason, thus I am not able to visualize a case of producing the result with in the different order from the original list. So I drew the corresponding map-reduce diagram, which by chance got the result preserving the order: enter image description here

问题:首先,我想确认一下这张图是否正确。其次,如果这个图是正确的,我想知道这个代码片段并不总是产生的原因在哪里result维持秩序


您的图表不正确 - 您假设每个并行减少都以新的开始StringBuilder。相反,每个并行减少开始具有相同的单位元- 使用相同的 StringBuilder(您创建并作为第一个参数传递给reduce方法)。

每个并行流调用StringBuilder.append在您传递给的(唯一的)StringBuilder 上reduce方法,从而将当前遇到的元素附加到它。

下一步是组合部分结果,也可以通过调用StringBuilder.append在同一个 StringBuilder 上,将 StringBuilder 的内容副本附加到其自身上。


要创建您绘制的图表,您必须传递一个Supplier<StringBuilder>作为归约操作的第一个参数。

实际上,根据 Holger 的评论,使用时这是可能的可变约简.

为此,您不调用reduce方法,而是调用collect method:

List<String> list = Arrays.asList("1","2","3","4","5","6",
    "7","8","9","10","11","12");
String result = list.parallelStream()
   .collect(StringBuilder::new, StringBuilder::append, 
       StringBuilder::append).toString();
System.out.println(result);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么以可变对象作为身份在并行流中调用reduce方法不会保留结果中的顺序? 的相关文章

随机推荐

  • 检查文件是否可执行

    我想知道检查程序是否可以用 bash 执行而不执行它的最简单方法是什么 它至少应该检查该文件是否具有执行权限 并且与当前系统具有相同的体系结构 例如 不是 Windows 可执行文件或其他不支持的体系结构 如果系统是 32 位 则不是 64
  • 在 ListActivity 上使用 setEmptyView 时出现问题

    我有以下设置 并且空视图文本不会显示 protected void onCreate Bundle savedInstanceState super onCreate savedInstanceState getListView setEm
  • gh - 页面上的 SvelteKit 部署不起作用。仅显示 HTML,不加载 CSS 和 JS

    如果我在本地构建项目并查看预览 则一切正常 如果我将其部署到 gh pages 则仅显示 HTML 并且无法加载 JS 和 CSS 这是为什么 我不知道我做错了什么 我也在官方 svelte Discord 服务器上询问过 我用的是 框架
  • 使用 poi 从 excel 文件读取图像和数据

    我知道如何从 Excel xls xlxs 读取数据 现在我的要求是我必须使用 POI 3 8 从 Excel 文件读取图像和数据 你能指导我该怎么做吗 使用 poi 从一个 excel 文件中读取图像和数据 提前致谢 直接来自开发者指南
  • 您能否/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?

    我在那里编写了一个带有自定义对象的 PCL 然后创建了一个 GUI 来处理来自 PCL 的对象 并且我尝试使用 PropertyGrid 来编辑属性 我已经阅读了该内容以便网格要知道如何处理该对象 我需要指定 EditorAttribute
  • 查找文本条件的 WebElement 基础

    我有一个自动完成功能list当我在文本字段中输入一些文本时 该窗口将打开 并且列表中的每个元素如下所示 div class tt dataset span class tt suggestions style display block d
  • 如何使用 Xcode Storyboards 协作开发项目?

    对于我正在为 iOS 开发的项目 我想与一些自由职业者合作 为了在 纯 代码上进行协作 我想使用 GitHub 但工作的很大一部分将集中在故事板以及与代码的连接上 这里有什么好的做法 我如何与他们共享 Xcode 项目 以便他们可以处理某些
  • LUIS 的使用是否受到限制?

    我在我的申请中收到异常消息 Exception Response status code does not indicate success 403 Quota Exceeded 这是否意味着 LUIS 上每个应用程序每月仅允许 1000
  • Java:检查命令行参数是否为空

    我希望对我的命令行参数进行一些错误检查 public static void main String args if args 0 null System out println Proper Usage is java program f
  • 在 MASM 中调用 C++ 函数

    我正在开发一个程序 该程序将使用 MASM 调用一些 C 函数 我在一个单独的文件中定义了对 2 个整数求和并显示输出 目前 我无法运行 main cpp asmMain 从 main cpp 调用函数 code asm promptFir
  • MapReduce java.lang.ArrayIndexOutOfBoundsException:0

    我尝试在 Java 中运行 MapReduce 但出现此错误 Exception in thread main java lang ArrayIndexOutOfBoundsException 0 at com mapreduce Word
  • 为什么系统调用不起作用?

    我在 MAC OSX 上 我试图通过程序集调用 execve 系统调用 他的操作码是 59 在linux中 我必须将操作码设置到eax中 然后将参数设置到其他寄存器中 但在这里我必须将操作码放入eax中 并将参数从右到左压入堆栈 所以我需要
  • cocos2d:将 iPhone 应用程序转换为通用应用程序

    我使用 cocos2d box2d 项目模板在 cocos2d 99 4 中开发了一个 App 应用程序 它在 iPhone 4 iPod 中运行良好 但我需要它转换为通用 我的意思是 iPad 版本也 我已经将其升级到iPad版本 以便它
  • 有没有一种方法可以处理模板函数的未定义引用错误,而无需在标头中实现它们?

    我希望问题已经清楚了 是否有另一种方法可以在不在头文件中实现模板函数的情况下避免出现未定义的引用错误 提前致谢 Marshall Cline 的 C FAQ 已经处理了这个问题 一种方法是使用export但我真的不建议使用它 因为并非所有编
  • 如何隐藏 iAD

    我想问以下问题 1 当用户点击空白屏幕时如何隐藏iAD 2 如何识别不活动状态 即用户是否打开了某个应用程序 然后离开了 iPhone 然后应用程序保持打开状态 Update 你可以做类似下面代码的事情 void bannerViewDid
  • QUiLoader:使用自定义小部件加载 .ui 文件的要求?

    我使用 Qt5 Designer 创建了一个 UI 我通过调用在运行时加载它 QUiLoader load qfile object this 就像魅力一样 但现在我推广了一些QLabel小部件类的元素MyQLabel与 源自QLabel
  • 如何使用 JAXB 通过 Jersey 1.17.1 生成 JSON 输出

    这个问题已经在这个网站上有一个正确的答案 问题是问题是泽西岛 1 6 and 泽西岛 1 17 1 的正确答案被埋在底部 我想我应该为此答案创建一个正确的问题 以便为遇到此问题的人 就像我一样 更容易找到帮助 首先 您需要将其添加到您的 w
  • Windows下的Services能做什么?

    有谁有关于 XP 下 Windows 服务功能的良好指南吗 特别是 我试图找出当作为服务运行的程序尝试打开窗口但未获得与桌面交互的权限时会发生什么 基本上 我有一个程序是一个 GUI 应用程序 它应该能够作为长期后台处理的服务运行 重写程序
  • 我当前正在合并哪些提交?

    当我执行时git merge 尚未创建新的提交 由于冲突或 no commit选项 如何检查我正在合并哪个分支 git status仅显示当前分支 A git merge that has stopped due to conflicts
  • 为什么以可变对象作为身份在并行流中调用reduce方法不会保留结果中的顺序?

    有以下看似 正确 的代码 List