在官方文档中,您可以阅读以下内容:



没有任何示例,这并不太有用。

我的问题是,UNORDERED特性到底意味着什么?我应该将其与诸如min或sum之类的归约收集器一起使用,还是仅适用于收集收集器?

在OpenJDK中,归约运算(最小,总和,平均)看起来具有空的特征。我希望至少在那里找到CONCURRENTUNORDERED

最佳答案

UNORDERED本质上意味着收集器既是关联的(规范要求)又是可交换的(不是必需的)。

关联性允许将计算分为多个子部分,然后将它们组合成完整的结果,但是需要严格排序组合步骤。从docs检查此代码段:

 A a2 = supplier.get();
 accumulator.accept(a2, t1);
 A a3 = supplier.get();
 accumulator.accept(a3, t2);
 R r2 = finisher.apply(combiner.apply(a2, a3));  // result with splitting

在最后一步combiner.apply(a2, a3)中,参数必须完全按此顺序出现,这意味着整个计算管道必须跟踪该顺序并最终遵守该顺序。

换句话说,我们必须对从递归拆分中得到的树进行排序。

另一方面,如果合并操作是可交换的,我们可以按任意顺序将任何子部分与其他任何部分合并,并始终获得相同的结果。显然,这会在空间和时间维度上带来许多优化机会。

应该注意的是,JDK中有UNORDERED收集器,它们不能保证可交换性。主要类别是与其他下游收集器组成的“高阶”收集器,但是它们不对它们强制执行UNORDERED属性。

关于java - Java 8 Collector UNORDERED特性是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39942054/

10-10 10:07