Java8 - 对流(数据)进行自定义分组:groupingBy收集器

groupingBy收集器

在JDK8中,可以对流进行方便的自定义分组,就像 SQL 语句中的 groupBy 一样,在JDK8中对应的分组函数是 Collectors 类的 groupingBy 方法。这种特性很有用:把数据拆分成不同的组,可以使处理数据更加灵活方便,在某些情况下例如按需处理、分块处理时更高效

例如:有一组人名,需要根据首字母(姓氏)进行分组,则可以通过 groupingBy 分组函数方便地实现。

下面是代码例子:

1
2
3
4
5
6
7
8
9
// 创建一个包含人名称的流
Stream<String> stream = Stream.of("Alen", "Hebe", "Zebe", "Helen", "Alex");
// 通过人名称的首字母进行分组
final Map<Character, List<String>> map = stream.collect(Collectors.groupingBy(s -> s.charAt(0)));
// 输出分组结果
map.forEach((letter, groups) -> {
System.out.println("以字母 " + letter + " 开头的名字如下:");
groups.forEach(name -> System.out.println("\t" + name));
});

程序输出结果如下:

1
2
3
4
5
6
7
8
以字母 A 开头的名字如下:
Alen
Alex
以字母 H 开头的名字如下:
Hebe
Helen
以字母 Z 开头的名字如下:
Zebe