实际上,java 8的作者编写了这个类:
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));
}
}然后,他谈到了特征枚举中的不同价值观意味着什么。然后他解释了为什么他写的这个收集器是IDENTITY_FINISH和并发的,而不是无序的,他说:
到目前为止开发的ToListCollector是IDENTITY_FINISH,因为用于在流中积累元素的列表已经是预期的最终结果,不需要任何进一步的转换,但是它并不是无序的,因为如果将其应用于有序流,则希望在结果列表中保留这种排序。最后,它是并发的,但是按照我们刚才所说的,只有在底层数据源无序的情况下,流才会被并行处理。
为什么只有在底层源的是无序的情况下,流才会被并行处理?我认为它仍然是并行处理的,但是组合器()必须保持顺序。这是书中的错误吗?
我认为Brian在最后一段中非常清楚地谈到了this post中有序流的并行处理。
这本书的页数是192-193页.
发布于 2018-05-31 13:34:16
这是完全错误的。即使在这里添加CONCURRENT特性也是错误的,因为您需要在Supplier中使用线程安全的数据结构。
https://stackoverflow.com/questions/50625544
复制相似问题