在官方文档中,您可以阅读以下内容:
没有任何示例,这并不太有用。
我的问题是,UNORDERED
特性到底意味着什么?我应该将其与诸如min或sum之类的归约收集器一起使用,还是仅适用于收集收集器?
在OpenJDK中,归约运算(最小,总和,平均)看起来具有空的特征。我希望至少在那里找到CONCURRENT
和UNORDERED
。
最佳答案
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/