java stream流根据对象中的某个属性对集合去重
时间: 2023-08-10 19:08:20 浏览: 191
java list根据对象的某个属性的值去重
在Java中,你可以使用`Stream`流对集合中的对象根据某个属性进行去重。以下是一个示例代码:
假设有一个名为`Person`的类,其中包含`name`和`age`属性:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
现在有一个`List`类型的对象列表,你可以使用以下代码根据`Person`对象的`age`属性对其进行去重:
```java
List<Person> people = new ArrayList<>();
// 添加一些 Person 对象到列表中
List<Person> distinctPeople = people.stream()
.filter(distinctByKey(Person::getAge))
.collect(Collectors.toList());
// 定义 distinctByKey 方法
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
```
以上代码将根据`age`属性对`people`列表进行去重。`distinctByKey`方法接收一个`Function`类型的参数,该参数指定要去重的属性。该方法返回一个`Predicate`类型的对象,它将检查给定的`Person`对象是否已被处理过。如果已处理,`Predicate`将返回`false`,否则将返回`true`。我们使用`ConcurrentHashMap`来记录已处理的对象,以确保线程安全。
请注意,以上代码将返回一个新的`List`对象,该对象只包含不同的`Person`对象。原始的`people`列表不会受到影响。
阅读全文