我对Stream API收集终端操作做了一些测试。书说组合器采取2个数据收集并合并它们。我在TreeSet上测试它。因为看不到实际上是否调用了TreeSet组合器的addAll方法我创建了PersonSet 。并声明了foo和fooAll方法。
可能对你来说这不是一个有趣或简单的问题,但请帮助我更好地理解它。
我有一个Person类:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" + "name=" + name + '}';
}
}
和
public class PersonSet<T> {
public PersonSet() {
System.out.println("PersonSet created");
}
public void foo(Person t) {
System.out.println("PersonSet append Person:" + t);
}
public void fooAll(PersonSet<T> t) {
System.out.println("PersonSet addAll:" + t);
}
}
我的主要课程是:
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream<Person> s = Stream.of(new Person("1"), new Person("2"), new Person("3"));
Supplier<PersonSet<Person>> supplier = PersonSet::new;
BiConsumer<PersonSet<Person>, Person> consumer1 = PersonSet::foo;
BiConsumer<PersonSet<Person>, PersonSet<Person>> consumer2 = PersonSet::fooAll;
PersonSet<Person> word = s.collect(
supplier,
consumer1,
consumer2
);
}
}
结果是:
创建了PersonSet
PersonSet追加Person:Person {name = 1}
PersonSet追加Person:Person {name = 2}
PersonSet追加人:人{name = 3}
你看到没有“PersonSet addAll:”。这意味着这个方法没有被调用
提前致谢
答案 0 :(得分:3)
组合器仅在流并行时使用,并决定在多个线程之间拆分工作,以便组合来自两个线程的结果。
因此,您需要一个并行流才能看到合并器正在运行。