java 用stream方式比较两个集合中某属性的差异,获得增删改的集合
时间: 2024-03-08 07:46:33 浏览: 66
假设有两个集合`list1`和`list2`,它们包含的元素类型相同,且元素都有一个属性`id`,下面是使用Java 8的Stream API来比较两个集合中元素的差异,获取增删改的集合的代码示例:
```java
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 构造测试用的两个集合
List<Person> list1 = List.of(new Person(1, "Tom"), new Person(2, "Jerry"), new Person(3, "Bob"));
List<Person> list2 = List.of(new Person(2, "Jerry"), new Person(3, "Alice"), new Person(4, "David"));
// 获取 list1 中被删除的元素的集合
Set<Integer> deletedIds = list1.stream()
.filter(p -> list2.stream().noneMatch(q -> q.getId() == p.getId()))
.map(Person::getId)
.collect(Collectors.toSet());
System.out.println("deletedIds: " + deletedIds); // 输出 "deletedIds: [1]"
// 获取 list2 中新增的元素的集合
List<Person> addedPersons = list2.stream()
.filter(p -> list1.stream().noneMatch(q -> q.getId() == p.getId()))
.collect(Collectors.toList());
System.out.println("addedPersons: " + addedPersons); // 输出 "addedPersons: [Person{id=4, name='David'}]"
// 获取 list1 和 list2 中相同 id 的元素中,name 属性不同的元素的集合
Map<Integer, String> list1IdToName = list1.stream().collect(Collectors.toMap(Person::getId, Person::getName));
Map<Integer, String> list2IdToName = list2.stream().collect(Collectors.toMap(Person::getId, Person::getName));
Set<Integer> commonIds = list1IdToName.keySet().stream().filter(list2IdToName::containsKey).collect(Collectors.toSet());
List<Person> changedPersons = commonIds.stream().filter(id -> !list1IdToName.get(id).equals(list2IdToName.get(id)))
.map(id -> list2.stream().filter(p -> p.getId() == id).findFirst().get())
.collect(Collectors.toList());
System.out.println("changedPersons: " + changedPersons); // 输出 "changedPersons: [Person{id=3, name='Alice'}]"
}
}
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
```
在上面的代码中,我们使用了Stream API的各种操作来获取删除、新增和修改的元素集合。其中,我们使用了filter、map、noneMatch、collect等操作来实现集合差异的计算。
阅读全文