在官方文档中,您可以阅读:
UNORDERED
Indicates that the collection operation does not commit to
preserving the encounter order of input elements.
没有任何例子,这没有太大帮助.
我的问题是,UNORDERED特征到底意味着什么?我应该使用减少收集器,如min或sum,还是只适用于收集器?
在OpenJDK看起来像减少操作(min,sum,avg)具有空特征.我期望在那里找到至少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属性.
翻译自:https://stackoverflow.com/questions/39942054/what-does-the-java-8-collector-unordered-characteristic-mean