使用Java 8 Streams对集合进行分组和排序

时间:2016-11-13 18:00:03

标签: java lambda java-8 grouping

我有一个根据年龄分组的人员列表(group1的年龄<20,group2的年龄> = 20),并使用Java 8根据姓名和年龄对每个组进行排序: 人员名单:

第1组:

Ane 12
Col 14

第2组:

James 24
thomas 34
Xavier 55

我想用Java 8做这样的事情:

list.stream().collect(Collectors.groupingBy(...

2 个答案:

答案 0 :(得分:7)

你可以通过以下方式获得你想要的东西:

  • 按年龄(然后命名)对整个人群进行排序。
  • 对其进行分区。

请注意,将保留每个分区的顺序:

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.partitioningBy;

people.stream()
  .sorted(
     comparing(Person::getAge)
       .thenComparing(Person::getName))
  .collect(partitioningBy(p -> p.getAge() >= 20))

感谢Christoffer的改进建议:斯堪的纳维亚Java必须像一套宜家装配说明一样光滑:)

答案 1 :(得分:2)

您将需要使用partitioningBy收集器。它将允许您指定谓词并返回由布尔值键入的映射:

Map<Boolean, List<?>> partitioned = list.stream().sorted(...).collect(Collectors.partitioningBy(...));