代码之家  ›  专栏  ›  技术社区  ›  Coder-Man

在动作手册中Java 8中无序特性的混淆

  •  4
  • Coder-Man  · 技术社区  · 6 年前

    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页。

    1 回复  |  直到 6 年前
        1
  •  7
  •   Eugene    6 年前

    这完全是错误的。甚至添加 CONCURRENT 这里的特性是错误的,因为您需要在 Supplier .