一个对象集合如何根据某个属性去重
时间: 2023-08-10 09:06:23 浏览: 83
要根据对象的某个属性值去重一个对象集合,可以使用Java 8的Stream API和`collect()`方法结合自定义的`Collector`来实现。以下是一个示例代码:
假设有一个`Person`类,其中包含`id`和`name`两个属性:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "Alice"));
personList.add(new Person(2, "Bob"));
personList.add(new Person(1, "Charlie"));
personList.add(new Person(3, "Alice"));
List<Person> distinctList = personList.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new ArrayList<>(personList.size())),
list -> list.stream().collect(Collectors.toMap(
Person::getId,
p -> p,
(existing, duplicate) -> existing
))))
.values()
.stream()
.collect(Collectors.toList());
distinctList.forEach(System.out::println);
}
}
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 + '\'' +
'}';
}
}
```
在上述示例中,我们使用了`toMap()`方法来创建一个Map,其中键是对象的某个属性值(这里是`id`),值是对象本身。在`toMap()`方法中,我们提供了一个合并函数,以保留原始对象而不是重复的对象。然后,我们通过获取Map的值集合,并将其转换为List,得到了根据`id`属性去重的对象集合。
输出结果如下:
```
Person{id=1, name='Alice'}
Person{id=2, name='Bob'}
Person{id=3, name='Alice'}
```
注意,这里使用了`collectingAndThen()`方法来在收集结束后执行一些操作,即将结果转换为List。这样可以避免直接对`toMap()`的结果进行修改。