java对象集合根据组合条件去重工具

2020-09-19  本文已影响0人  任未然

一. 概述

在开发中, 经常碰到一些数据去重问题, 个人总结了一下封装了个工具类, 觉得还是挺好用的

二. 工具

public class ListUtil {
    /**
     * 对象集合根据条件去重
     * @param tList 集合
     * @param keyExtractor 指定去重的条件
     * @param <T>
     * @return
     */
    public static <T> List<T> listDeduplication(List<T> tList, Function<? super T, ?> keyExtractor){
        if (null != tList) {
            return tList.stream().filter(distinctByVariable(u -> keyExtractor.apply(u))).collect(Collectors.toList());
        }else {
            return null;
        }
    }

    /**
     * putIfAbsent() 方法是
     *      如果 key对应的value值不存在, key value 添加到 map 中,并返回 null
     *      如果 key对应的value值已存在, key value 不再添加到 map 中, 并返回原 value
     *
     * 故 newKey(这里的newKey对应user对象中的name的值), 如果(newKey, Boolean.TRUE) 在map中已存在,
     * putIfAbsent(newKey, Boolean.TRUE) 会返回 Boolean.TRUE (Boolean.TRUE 被final修饰,故其地址值唯一, 可用作比较)
     * 然后判断是否等于 null, 返回false, filter接收到结果为false的Predicate并将该值过滤掉
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctByVariable(Function<? super T, ?> keyExtractor) {
        HashMap<Object, Boolean> map = new HashMap<>();
        return t->map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}

三. 测试

    /**
     * 测试, 根据用户id和名字去重
     */
    @Test
    public void testListDeduplication(){
        @Data
        @AllArgsConstructor
        class User{
            private int userId;
            private String userName;
        }
        ArrayList<User> users = new ArrayList<>();
        users.add(new User(1,"小王"));
        users.add(new User(1,"小王"));
        users.add(new User(2,"小王"));
        users.add(new User(2,"小王"));

        // 根据用户id和用户名去重
        List<User> users1 = ListUtil.listDeduplication(users, u -> {
            return u.getUserId() + u.getUserName();
        });
        // 打印检查
        users1.forEach(u->{
            System.out.println(u.getUserId()+"-"+u.getUserName());
        });
    }

打印结果:

1-小王
2-小王
上一篇下一篇

猜你喜欢

热点阅读