为什么从未达到collect方法中的BiConsumer Combiner代码?

时间:2019-07-31 04:54:43

标签: java java-8 java-stream collectors

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

class Person {
    private int age;

    public int getAge() {
        return age;
    }
}

//第二种收集方式

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);

1 个答案:

答案 0 :(得分:2)

仅当您并行调用流处理管道时才调用合并器函数。因此,将其更改为并行流,然后应达到合并器功能。所以应该触发它。

people.parallelStream()...

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