Java 8 Collector UNORDERED特性是什么意思?

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

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属性.

相关文章
相关标签/搜索