假设我们有一个 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。

Java Stream 去重:使用 distinctByKey 方法根据 positionId 属性去重

原文地址: https://www.cveoy.top/t/topic/lLbN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录