对象集合根据多个对象属性去重
时间: 2023-11-22 11:04:51 浏览: 72
可以使用Java 8中的Stream API来实现这个功能。假设有一个对象集合List<T>,要根据多个对象属性去重,可以按照以下步骤实现:
1. 定义一个Set集合,用于存储去重后的结果。
2. 调用集合的stream()方法,将集合转换成Stream流。
3. 使用Stream的distinct()方法,对集合进行去重操作。这里需要自定义一个比较器,实现多个对象属性的比较。
4. 使用Stream的forEach()方法,将去重后的结果添加到Set集合中。
5. 最后,将Set集合转换成List集合,返回去重后的结果。
下面是示例代码:
```
Set<T> set = new HashSet<>();
List<T> result = list.stream().distinct().sorted((o1, o2) -> {
// 自定义比较器,根据多个对象属性进行比较
// 这里假设对象有两个属性:name和age
if (o1.getName().equals(o2.getName())) {
return o1.getAge() - o2.getAge();
} else {
return o1.getName().compareTo(o2.getName());
}
}).peek(set::add).collect(Collectors.toList());
```
其中,peek()方法用于在添加元素到Set集合时进行打印,以便调试。您可以根据实际情况进行修改。
相关问题
java8 lamda集合 根据对象的多个属性去重
和根据单个属性去重类似,我们可以使用Java 8的Lambda表达式和Stream API实现根据对象的多个属性去重。
假设我们有一个Person类,其中包含属性name和age,我们需要根据name和age属性去重,可以按照以下步骤进行操作:
1. 创建一个List<Person>对象,包含多个Person对象,例如:
```
List<Person> personList = new ArrayList<>();
personList.add(new Person("Alice", 20));
personList.add(new Person("Bob", 22));
personList.add(new Person("Alice", 18));
personList.add(new Person("Bob", 22));
```
2. 使用Stream API调用distinct()方法,并传入一个Lambda表达式,以根据name和age属性去重,例如:
```
List<Person> distinctList = personList.stream()
.filter(distinctByKeys(Person::getName, Person::getAge))
.collect(Collectors.toList());
```
3. 在distinctByKeys()方法中,使用一个Map对象来存储已经出现过的name和age值,实现去重操作,例如:
```
public static <T> Predicate<T> distinctByKeys(Function<? super T, ?>... keyExtractors) {
final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>();
return t -> {
final List<?> keys = Arrays.stream(keyExtractors)
.map(ke -> ke.apply(t))
.collect(Collectors.toList());
return seen.putIfAbsent(keys, Boolean.TRUE) == null;
};
}
```
这样,我们就可以根据对象的多个属性去重,得到一个去重后的List对象。
java8 lamda集合 根据对象的属性去重
在Java 8中,可以使用Lambda表达式和Stream API实现根据对象属性去重的操作。
假设我们有一个Person类,其中包含属性name和age,我们需要根据name属性去重,可以按照以下步骤进行操作:
1. 创建一个List<Person>对象,包含多个Person对象,例如:
```
List<Person> personList = new ArrayList<>();
personList.add(new Person("Alice", 20));
personList.add(new Person("Bob", 22));
personList.add(new Person("Alice", 18));
```
2. 使用Stream API调用distinct()方法,并传入一个Lambda表达式,以根据name属性去重,例如:
```
List<Person> distinctList = personList.stream()
.filter(distinctByKey(Person::getName))
.collect(Collectors.toList());
```
3. 在distinctByKey()方法中,使用一个Map对象来存储已经出现过的name值,实现去重操作,例如:
```
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;
}
```
这样,我们就可以根据对象的属性去重,得到一个去重后的List对象。
阅读全文