胜人者有力,自胜者强。——先秦《老子》
今天发现了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));
|
实际上,我只需要此处User
的name
,我希望得到的是一个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())
|
可以在分组后再获取其中属性,或者还可以进行别的计算如分组后再根据每一组内获取最大值等