我们经常会在终止操作用到Collectors API的groupingBy方法,如
List<User> userList = Arrays.asList(new User("alice",18,"female"),
new User("bob",19,"male"),
new User("carl",18,"male"),
new User("dasy",19,"female"));
Map<String,List<User>> genderMap = userList.stream()
.collect(Collectors.groupingBy(User::getGender));
以上代码块表示,把一个用户集合按性别分组,每一组的结果还是一个list集合。genderMap的键表示性别,值为对应的集合。
groupingBy除了以上常用的方式,还有2个重载方法。
Map<String,Long> genderCountMap = userList.stream()
.collect(Collectors.groupingBy(User::getGender,
Collectors.counting()));
多了一个参数,可以指定一个下游收集器,来处理分组后的集合。以上代码相比第一个方法多了一个counting收集器,表示计算分组后user集合的大小。对应的接受参数类型也由List<User>变为Long.
Map<String,Long> linkedCountMap = userList.stream()
.collect(Collectors.groupingBy(User::getGender,
LinkedHashMap::new,Collectors.counting()));
相比方法二又多了一个参数,可以指定一个映射工厂。以上代码表示指定结果集为LinkedHashMap.