Collectors.groupingBy 后将value替换为对象
时间: 2024-08-13 16:03:17 浏览: 52
深入探索Java 8的`Collectors.groupingBy()`:分组的艺术
`Collectors.groupingBy()` 是 Java Stream API 中的一个收集器,它用于将数据分组到键值映射中,其中键通常是某个属性或者函数的结果,而值则是该键对应的元素列表。如果想要替换 value(即元素列表),而不是直接保存原始元素,你可以创建一个新的对象,并将需要的数据放入这个新对象中。
例如,假设你有一个 `Person` 对象列表,你想按年龄分组,并为每个年龄段创建一个新的 `AgeGroup` 对象,其中包含平均年龄、总人数等信息,你可以这样做:
```java
List<Person> people = ...; // 假设 Person 类有一个 age 属性
Map<Integer, AgeGroup> groups = people.stream()
.collect(Collectors.groupingBy(Person::getAge,
Collectors.collectingAndThen(Collectors.toList(), ageGroup -> {
double averageAge = ageGroup.stream().mapToInt(Person::getAge).average().orElse(0);
return new AgeGroup(ageGroup.get(0).getAge(), averageAge, ageGroup.size());
}的商品));
```
在这个例子中,`collectingAndThen` 方法接收两个 collector,首先将人按照年龄分组(`toList`),然后创建一个新的 `AgeGroup` 对象并计算统计信息。
阅读全文