胜人者有力,自胜者强。——先秦《老子》

今天发现了Collectors.mapping的正确姿势

使用场景如下:

我想要对一个List<User>进行groupBy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class User {

private String name;
private Integer age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}

List<User> users = Arrays.asList(new User("ruben", 18), new User("vampire", 18));
Map<Integer, List<User>> ageUsersMap = users.stream().collect(Collectors.groupingBy(User::getAge));

实际上,我只需要此处Username,我希望得到的是一个List<age,List<name>>这样结构的数据

这时候,Collectors.mapping就出现啦!

1
Map<Integer, List<String>> ageNamesMap = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.mapping(User::getName, Collectors.toList())));

这里使用了

1
Collectors.groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream)

第二个参数就是说你分组之后还想做一些后续处理,例如根据age分组后再根据name分组一次,或者我这里的,分组后,使用

1
Collectors.mapping(User::getName, Collectors.toList())

可以在分组后再获取其中属性,或者还可以进行别的计算如分组后再根据每一组内获取最大值等