List<Person> 按id分组,然后求和Person中指定多个字段,返回 Map<String, Person>
时间: 2025-06-28 08:03:40 浏览: 10
### 实现 `List<Person>` 按 ID 分组并汇总特定字段
为了实现这一需求,可以利用 Java 的 Stream API 和 Collectors 工具类来简化操作。假设 `Person` 类具有 `id`, `name`, 及其他需要求和的数值型属性(例如 `salary`)。下面展示如何通过流处理完成此任务。
首先定义 `Person` 类结构:
```java
public class Person {
private String id;
private String name;
private double salary;
public Person(String id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
// Getters and Setters...
}
```
接着编写用于分组及聚合的方法:
```java
import java.util.*;
import java.util.stream.Collectors;
// ...
private static Map<String, Person> groupByIdAndSum(List<Person> people) {
return people.stream().collect(
Collectors.groupingBy(Person::getId,
Collectors.collectingAndThen(Collectors.reducing((p1, p2) -> new Person(
p1.getId(),
p1.getName(), // 假设名字相同或取第一个即可
p1.getSalary() + p2.getSalary())), Optional::get)));
}
```
上述方法中使用了 `Collectors.groupingBy()` 来按照 `id` 进行分组,并且对于每一个分组内的对象集合应用了一个自定义规约函数 `(p1, p2)` 将两个 `Person` 对象合并成一个新的实例,在这里实现了薪水相加的功能[^1]。
注意:如果希望保留原始列表中的某些特性(比如姓名),则可以在创建新的 `Person` 对象时做适当调整;另外,当存在多个同名记录时可能还需要额外逻辑决定如何处理名称冲突等问题。
最后调用该方法并将结果存储到期望的数据结构中去:
```java
List<Person> personList = Arrays.asList(new Person("001", "Alice", 5000),
new Person("002", "Bob", 6000),
new Person("001", "Charlie", 7000));
Map<String, Person> result = groupByIdAndSum(personList);
System.out.println(result.values());
```
这样就可以得到按 `id` 分组后的人员信息以及对应薪资总和的结果集。
阅读全文
相关推荐















