根据集合中指定的对象属性去重复

根据集合中User对象name属性去重复,重复值保留第一次出现的,使用方式如下

public class Test {
    
    public static void main(String[] args) {
        // 模拟数据
        List<User> list = Arrays.asList(new User("a", 2), new User("a", 3), new User("b", 3));
        // 根据集合中指定的对象属性去重复
        List<User> collect = list.stream().filter(CollUtils.distinctByKey(User::getName)).collect(Collectors.toList());
        System.out.println(collect);
    }

    @Data
    @AllArgsConstructor
    static class User {
        private String name;
        private Integer age;
    }
    
}

输出:

[App.User(name=a, age=2), App.User(name=b, age=3)]

实现代码如下

public class CollUtils {

    /**
     * 根据集合对象中指定的字段去重复
     *
     * @param keyExtractor keyExtractor
     * @param <T>          t
     * @return Predicate
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }

}
更新日期:
作者: qwding, 丁乾文