首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在操作手册中混淆Java 8中的Characteristics.UNORDERED

在操作手册中混淆Java 8中的Characteristics.UNORDERED
EN

Stack Overflow用户
提问于 2018-05-31 13:30:39
回答 1查看 419关注 0票数 5

实际上,java 8的作者编写了这个类:

代码语言:javascript
复制
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页.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 13:34:16

这是完全错误的。即使在这里添加CONCURRENT特性也是错误的,因为您需要在Supplier中使用线程安全的数据结构。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50625544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档