不调用自定义组合器

时间:2016-12-22 22:04:32

标签: java collections

我对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:”。这意味着这个方法没有被调用

提前致谢

1 个答案:

答案 0 :(得分:3)

组合器仅在流并行时使用,并决定在多个线程之间拆分工作,以便组合来自两个线程的结果。

因此,您需要一个并行流才能看到合并器正在运行。