java使用stream的distinct,根据对象的positionId去重后转list输出
假设我们有一个Person类,其中包含一个positionId属性:
public class Person {
private String name;
private int age;
private int positionId;
// 省略构造方法和getter/setter方法
}
我们想根据positionId属性对Person对象进行去重,并将结果转换为List。可以使用Java 8中的Stream API来实现:
List<Person> persons = Arrays.asList(
new Person("Alice", 25, 1),
new Person("Bob", 30, 2),
new Person("Charlie", 35, 1),
new Person("David", 40, 3),
new Person("Eva", 45, 2)
);
List<Person> distinctPersons = persons.stream()
.filter(distinctByKey(Person::getPositionId))
.collect(Collectors.toList());
System.out.println(distinctPersons);
输出结果为:
[Person{name='Alice', age=25, positionId=1}, Person{name='Bob', age=30, positionId=2}, Person{name='David', age=40, positionId=3}]
我们使用了一个名为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;
}
该方法接受一个Function类型的参数,用于提取对象的关键属性。在上面的例子中,我们传递了Person::getPositionId方法引用作为参数,表示使用positionId属性作为关键属性进行去重。
该方法返回一个Predicate类型的结果,用于在Stream的filter方法中进行过滤。在过滤时,我们使用了Java 8中的ConcurrentHashMap来保存已经出现过的关键属性值,如果该值已经存在,则表示该对象已经出现过,不再进行保留。
最后,我们使用Stream的collect方法将结果转换为List。
原文地址: https://www.cveoy.top/t/topic/xIw 著作权归作者所有。请勿转载和采集!