我按如下方式对流进行分组和分区:
// 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));
答案 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)