我可以根据功能对分组流进行分区吗?

时间:2016-12-05 10:50:32

标签: collections java-8 streaming grouping java-stream

我按如下方式对流进行分组和分区:

// Partioning
Map<Boolean, List<Person>> partitioned = persons.stream().
                                          collect(Collectors.partitioningBy(p -> p.getAge() > 20));

// Grouping
Map<String, List<Person>> grouped = persons.stream()
                                .collect(Collectors.groupingBy(p -> p.getCity()));

有没有办法可以将这两者结合起来?我尝试将两者结合使用groupingBy in partioningBy,但没有把事情弄清楚。有什么建议吗?

预期结果是对那些名字以P开头并按年龄分组的人进行分区。 这是人员名单: 列出人员=

Arrays.asList(
            new Person("Max", 18),
            new Person("Peter", 23),
            new Person("Pamela", 23),
            new Person("David", 12),
            new Person("Pam", 12)); 

2 个答案:

答案 0 :(得分:0)

我尝试了以下内容,并且它有效。

Map<Boolean, Map<Object, List<Person>>> rr = persons.stream()
                                            .collect(Collectors.partitioningBy(p -> p.name.startsWith("P"), 
                                                    Collectors.groupingBy(p -> p.age > 20)));

输出符合预期

rr = {false={false=[Max, David]}, true={false=[Pam], true=[Peter, Pamela]}}

但是,我不确定这是否是有效的方法。有什么建议吗?

答案 1 :(得分:0)

  

预期结果是 将姓名与姓名分开的人   以P 开头,然后 按年龄分组

从问题中看来,您似乎不需要在groupingBy中执行条件检查,如下所示:

Map<Boolean, Map<Integer, List<String>>> rr = persons.stream()
        .collect(Collectors.partitioningBy(p -> p.getName().startsWith("P"),
                Collectors.groupingBy(Person::getAge,
                        // just for printing the output below
                        Collectors.mapping(Person::getName, Collectors.toList()))));

在您输入以下内容后,就会得到结果:

{false={18=[Max], 12=[David]}, true={23=[Peter, Pamela], 12=[Pam]}}
 ^                                    ^
 partitioned (startsWith P)          grouped by(age)