今天发现了Collectors.mapping
的正确姿势
使用场景如下:
我想要对一个List<User>
进行groupBy
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));
实际上,我只需要此处User
的name
,我希望得到的是一个List<age,List<name>>
这样结构的数据
这时候,Collectors.mapping
就出现啦!
Map<Integer, List<String>> ageNamesMap = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.mapping(User::getName, Collectors.toList())));
这里使用了
Collectors.groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream)
第二个参数就是说你分组之后还想做一些后续处理,例如根据age
分组后再根据name
分组一次,或者我这里的,分组后,使用
Collectors.mapping(User::getName, Collectors.toList())
可以在分组后再获取其中属性,或者还可以进行别的计算如分组后再根据每一组内获取最大值等