利用Stream流比较两个list 如果对象id相同则替换,不同则新增
时间: 2024-09-12 09:04:04 浏览: 33
两个List集合取相同重复数据的方法
在Java 8及以上版本中,可以利用Stream API来实现两个列表(List)的比较操作,如果一个列表中的对象根据id与另一个列表中的对象相同,则替换,否则新增到另一个列表中。以下是实现这一操作的一个示例:
```java
import java.util.*;
import java.util.stream.Collectors;
class MyObject {
private int id;
private String name;
// 构造函数、getter和setter省略
public MyObject(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ListCompare {
public static void main(String[] args) {
List<MyObject> list1 = Arrays.asList(
new MyObject(1, "Object1"),
new MyObject(2, "Object2"),
new MyObject(3, "Object3")
);
List<MyObject> list2 = Arrays.asList(
new MyObject(1, "UpdatedObject1"),
new MyObject(2, "Object2"),
new MyObject(4, "NewObject")
);
// 创建一个新的列表,用于存放处理后的结果
List<MyObject> resultList = new ArrayList<>(list2);
// 使用Stream处理list1中的元素,如果在list2中存在相同的id,则替换
list1.stream()
.forEach(obj1 -> resultList.removeIf(obj2 -> obj2.getId() == obj1.getId()))
.forEach(obj1 -> resultList.add(obj1));
// 输出结果
resultList.forEach(System.out::println);
}
}
```
在这个示例中,我们首先创建了两个`MyObject`对象的列表:`list1`和`list2`。我们的目标是将`list1`中的对象和`list2`中的对象根据id进行比较,如果`list2`中已存在相同的id,则用`list1`中的对象替换它;如果不存在,则添加到`list2`中。
为了实现这个目标,我们创建了一个新的列表`resultList`,它最初是基于`list2`的。然后我们使用`list1`的Stream来遍历每一个对象,并使用`removeIf`方法和`forEach`方法来完成替换和添加的操作。
注意,示例代码中使用的`removeIf`方法可能会因为遍历和删除导致并发修改异常(`ConcurrentModificationException`),在实际应用中可能需要使用线程安全的集合或其他同步机制来避免这个问题。
阅读全文