parallelStream与collector合并顺序差异原因解析
并行流collect合并函数的执行逻辑解析
先看你的代码场景:使用并行流收集元素时,collect的第三个参数是合并器(combiner),它的作用是把多线程生成的子容器合并为最终结果。
核心原因:合并器的参数含义与结果容器归属
collect的三个参数分工明确:
- 供应器(supplier):
ArrayList::new,每个线程会生成独立的子ArrayList容器 - 累加器(accumulator):
(x, y) -> x.add(y),将流元素y添加到当前线程的子容器x中 - 合并器(combiner):
(x, y) -> ...,这里的x是JVM选定的最终要保留的主容器,y是待合并后丢弃的临时子容器
情况1:合并器使用y.addAll(x)
并行处理时,假设线程A生成装[1]的容器,线程B生成装[2]的容器。合并阶段JVM会指定其中一个作为主容器x,另一个作为临时容器y。
如果执行y.addAll(x),只是把x的元素加到y里,但最终返回的是主容器x,y里的合并结果会被直接丢弃。比如:
- 若
x是[1],y是[2],执行后y变成[2,1],但最终结果还是x的[1],所以输出[1]。
情况2:合并器使用x.addAll(y)
同样的场景下,x.addAll(y)是把临时容器y的元素合并到主容器x中,x会变成包含所有元素的列表(顺序不保证,但元素完整),最终返回x,所以输出[1, 2]或[2, 1]。
关键误区
你可能误以为合并器只是简单合并两个容器,但实际上合并器的返回值会作为新的主容器参与后续合并,标准逻辑应该是将临时容器的元素合并到主容器中,而非反向操作。
内容的提问来源于stack exchange,提问作者happy
相关产品推荐
相关产品推荐

