java 一个list对象根据多个相同字段合并
时间: 2025-06-28 12:19:38 浏览: 3
### 合并具有相同字段的Java List对象
当需要基于多个相同字段合并`List`对象时,可以采用多种策略。对于复杂类型的列表,尤其是那些包含自定义类的对象列表,利用Java 8引入的流(Stream)API是一个高效的选择。
#### 使用Stream API与Collectors.groupingBy
通过组合使用`stream()`方法创建流实例以及`Collectors.groupingBy`收集器,可以根据指定的关键字对元素分组。为了依据多个字段进行匹配,在此之前应当先构建一个复合键。下面的例子展示了如何根据两个字段`id`和`name`来聚合用户记录:
```java
import java.util.*;
import java.util.stream.Collectors;
class User {
private int id;
private String name;
private double balance;
public User(int id, String name, double balance) {
this.id = id;
this.name = name;
this.balance = balance;
}
// Getters and setters omitted for brevity
@Override
public boolean equals(Object o){
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User)o;
return Objects.equals(id,user.getId()) &&
Objects.equals(name,user.getName());
}
@Override
public int hashCode(){
return Objects.hash(id,name);
}
}
public class Main {
static record Key(Integer id, String name){}
public static void main(String[] args) throws Exception {
List<User> list1 = Arrays.asList(
new User(1,"Alice",90),
new User(2,"Bob",-7));
List<User> list2 = Arrays.asList(
new User(1,"Alice",5),
new User(3,"Charlie",4));
Map<Key, DoubleSummaryStatistics> result =
Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.groupingBy(u -> new Key(u.getId(), u.getName()),
Collectors.summarizingDouble(User::getBalance)));
System.out.println(result.entrySet().stream()
.map(e->String.format("%s=%f",e.getKey(), e.getValue().getSum()))
.collect(Collectors.joining(", ", "[", "]")));
}
}
```
上述程序首先定义了一个内部静态类`Key`用于表示由`id`和`name`构成的唯一标识符。接着,它将来自不同源表单的所有条目汇集在一起形成单一序列,并按照新创建的`Key`来进行分类汇总。最后输出的是每组用户的总余额统计信息[^1]。
这种方法不仅限于处理简单的数值累加运算;还可以扩展至其他形式的数据融合逻辑,比如取最新版本、求平均值等。此外,如果目标仅仅是去除重复项而不关心额外计算,则可以直接调用`distinct()`函数配合重写过的`equals()`和`hashCode()`方法达到目的[^2]。
#### 应用场景拓展
除了基本的去重外,这种技术同样适用于更复杂的业务需求,例如同步数据库查询结果集或是整合多渠道输入的信息资源。只要能够清晰界定哪些属性应该作为关联条件参与比较即可灵活运用这一模式[^3]。
阅读全文
相关推荐


















