Java Stream 去重:使用 distinctByKey 方法根据 positionId 属性去重
假设我们有一个 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/lLbN 著作权归作者所有。请勿转载和采集!