假设我们有一个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的distinct,根据对象的positionId去重后转list输出

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

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