Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么collect方法中的这个双消费组合器代码永远达不到?_Java_Java 8_Java Stream_Collectors - Fatal编程技术网

Java 为什么collect方法中的这个双消费组合器代码永远达不到?

Java 为什么collect方法中的这个双消费组合器代码永远达不到?,java,java-8,java-stream,collectors,Java,Java 8,Java Stream,Collectors,在main方法中,我创建了一个不同年龄的人的列表。现在,当我使用collect方法将此列表转换为一个人的年龄列表时,BiConsumer combiner函数中的代码永远不会到达 class Person { private int age; public int getAge() { return age; } } //收藏的第二味道 ArrayList<Integer> pAges = people.stream()

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

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);
arraylistpages=people.stream()
.collect(数组列表::新建,
(listGivenBySupplier,PersonObject fromPeopleStream)->listGivenBySupplier.add(PersonObject fromPeopleStream.getAge()),
(r1,r2)->{//还请解释传递给r1和r2的值
System.out.println(“r1:+r1”);
System.out.println(“r2:+r2”);
r1.加入(2222);
r2.增加(2211);
});
System.out.println(“页数:+页数);

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

people.parallelStream()...

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

您可以使用stream().map()作为下一个:List ages=people.stream().map(Person::getAge).collect(Collectors.toList())@lub0v我知道这一点,但我想在供应商、双消费累加器和双消费组合器中使用collect()的另一种风格。这里有一个相同的问题,顺便说一句,谢谢你,它现在可以工作了,但是你能解释一下为什么它只适用于并行流而不适用于顺序流吗?并行,意味着使用部分拆分。之后,必须将整个结果合并,比如说将几个部分列表合并成一个完整的列表。@JoopEggen好的,现在我明白了,谢谢