java - 为什么永远不会到达collect方法中的BiConsumer Combiner代码?

标签 java java-8 java-stream collectors

在主方法中,我创建了一个不同年龄的人员列表。现在,当我使用collect方法将该列表转换为人员年龄列表时。BiConsumer组合器函数中的代码永远不会到达。

class Person {
    private int age;

    public int getAge() {
        return age;
    }
}

//collect 的第二种风格

ArrayList<Integer> pAges = people.stream()
                            .collect(ArrayList<Integer>::new, 
                                    (listGivenBySupplier, personObjectFromPeopleStream) -> listGivenBySupplier.add(personObjectFromPeopleStream.getAge()), 
                                    (r1, r2) -> {  //Also please explain what value is passed to r1 and r2
                                            System.out.println("r1: " + r1);
                                            System.out.println("r2: " + r2);
                                            r1.add(2222);
                                            r2.add(2211); 
                            });
System.out.println("pAges:" + pAges);

最佳答案

仅当并行调用流处理管道时才会调用组合器函数。所以改成并行流就应该到达combiner函数了。所以这应该会触发它。

people.parallelStream()...

对于一个实例,假设有 2 个工作线程处理此工作负载。任何并行执行都涉及将源拆分为多个部分,并发执行它们,最后将部分结果合并到一个结果容器中。每个线程 T1 和 T2 都有一个关联的 List,因此容器是线程受限的。累加器函数将每个单个元素添加到关联的容器中。线程 T1 和 T2 完成后,部分容器应合并到一个大结果容器中。这就是组合器功能发挥作用的地方。在串行执行中,不涉及结果的合并,因此组合器在那里没有用处。

关于java - 为什么永远不会到达collect方法中的BiConsumer Combiner代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57283432/

相关文章:

Java 枚举类型名称反射

java - 在 Eclipse Tree Viewer 中单独选择树节点

java - 如何使用 Java 8 方法对 List<List<>> 结构中的每个元素应用一些更改

java - 使用 IntSummaryStatistics 跨多个字段取平均值

Java > 8 stream 同时统计多个项目

Android Studio 中库的 Java 1.7 兼容性

java - 通过对象访问类方法

java - 使用哪些收集器?

datetime - 为什么输出中出现负号?

java - 如何使用 lambda 表达式重构工厂类?