美文网首页
java对象集合根据组合条件去重工具

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

作者: 任未然 | 来源:发表于2020-09-19 15:17 被阅读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-小王
    

    相关文章

      网友评论

          本文标题:java对象集合根据组合条件去重工具

          本文链接:https://www.haomeiwen.com/subject/nqweyktx.html