JAVA 8在Actudio中的作者编写了这个类:
class ToListCollector<T> implements Collector<T, List<T>, List<T>> {
@Override
public Supplier<List<T>> supplier() {
return ArrayList::new;
}
@Override
public BiConsumer<List<T>, T> accumulator() {
return List::add;
}
@Override
public BinaryOperator<List<T>> combiner() {
return (l1, l2) -> {
l1.addAll(l2);
return l1;
};
}
@Override
public Function<List<T>, List<T>> finisher() {
return Function.identity();
}
@Override
public Set<Characteristics> characteristics() {
return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
}
}
然后他讨论了特征枚举中的不同值意味着什么。然后,他解释了为什么他写的这个收藏家是身份完成的,是并发的,而不是无序的,他说:
目前开发的tolistcollector是identity\u finish,因为
累加流中的元素已经是预期的最终结果,不需要任何
进一步的转换,但它不是无序的,因为如果将其应用于有序流
您希望此顺序保留在结果列表中。最后,它是并行的,但是
按照我们刚才所说的,只有当流的底层数据
来源是无序的。
为什么要并行处理流
只有
底层源是无序的?我认为它仍将并行处理,但combiner()必须保持顺序。这是书上的错误吗?
我认为brian goetz非常清楚地谈到了在
this post
在最后一个巴拉夫。
这本书的页数是192-193页。