jdk1.8中list按对象的多个属性去重,按对象的某个属性分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk1.8中list按对象的多个属性去重,按对象的某个属性分组相关的知识,希望对你有一定的参考价值。

参考技术A List pdVos = pdVoListList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(o -> o.getPiCode() +";" + o.getDeveloperCode()))), ArrayList::new));// 按多个属性去重列表

Map<String,List<PdVo>> pdVoMap = pdVos.stream().collect(Collectors.groupingBy(PdVo::getDeveloperCode));// 按某个属性分组

java按照list集合中的对象属性进行去重

文章目录

1.java按照list集合中的对象属性进行去重

有时候我们需要对List集合进行去重,但是去重的集合不是String,Integer等简单的数据类型,而是复杂的对象类型,并且是根据List集合中的对象的指定属性进行去重,我这里封装了一个方法,是根据jdk源码来的,不需要引入任何第三方依赖,无任何侵入性。非常的灵活,可以指定任意属性进行去重。

具体看代码:

public class DistinctListTest 

    public static void main(String[] args) throws Exception 
       

        User userInfo1 = new User("1", "admin");
        User userInfo2 = new User("2", "root");
        User userInfo4 = new User("3", "admin");
        User userInfo3 = new User("4", "jack");


        List<User> userInfoList = Arrays.asList(userInfo1, userInfo2, userInfo3, userInfo4);

        System.out.println(distinctListForAttribute(userInfoList,"name"));



    

    /**
     * 根据对象属性名获取属性值
     * @param target 目标对象
     * @param filedName 属性名称
     * @return java.lang.Object
     * @date 2022/6/25 21:31
     * @since 1.0.0
     **/
    public static Object getFieldValue(Object target, String filedName) 

        if (target == null || filedName == null ||  filedName.trim().length()<=0)
            throw new ArithmeticException("target 或 filedName 不能为空!");
        

        Class<?> clazz = target.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) 
            field.setAccessible(true);
            if (field.getName().equals(filedName)) 
                try 
                    return field.get(target);
                 catch (IllegalAccessException e) 
                    e.printStackTrace();
                    throw new RuntimeException("根据对象属性名获取属性值发生错误:" + e.getMessage());
                
            
        
        throw new RuntimeException("未能根据对象属性名获取属性值");
    

    /**
     * 对list集合中的元素按照属性进行去重,去重完毕后属性不发生变化
     *
     * @param userInfoList 需要去重的集合
     * @return java.util.List<compass.city.service.demo.PatternTest.UserInfo>
     * @date 2022/6/25 21:03
     * @since 1.0.0
     **/
    public static <T extends Object > List<T> distinctListForAttribute(List<T> userInfoList,String filedName) 
        List<T> filteredList = new ArrayList<>();
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        try 
            userInfoList.stream()
                    .filter(item-> seen.putIfAbsent(getFieldValue(item,filedName), Boolean.TRUE) == null)
                    .forEach(filteredList::add);
            seen.clear();
        catch (Exception e)
            e.printStackTrace();
            throw new RuntimeException("根据属性名去重List集合中的对象发生异常:"+e.getMessage());
        
        return  filteredList;
    


    static class User 

        @Override
        public String toString() 
            return "User" +
                    "id='" + id + '\\'' +
                    ", name='" + name + '\\'' +
                    '';
        
        public User()  

        public User(String id, String name) 
            this.id = id;
            this.name = name;
        

        private String id;
        private String name;

        public String getId() 
            return id;
        

        public void setId(String id) 
            this.id = id;
        

        public String getName() 
            return name;
        

        public void setName(String name) 
            this.name = name;
        
    




以上是关于jdk1.8中list按对象的多个属性去重,按对象的某个属性分组的主要内容,如果未能解决你的问题,请参考以下文章

java8 List去重

maxBy() List() 中对象的多个属性

多个相同的对象存储在List集合,根据对象内的某一个属性去重并且实现其中一个字段相加

多个相同的对象存储在List集合,根据对象内的某一个属性去重并且实现其中一个字段相加

多个相同的对象存储在List集合,根据对象内的某一个属性去重并且实现其中一个字段相加

多个相同的对象存储在List集合,根据对象内的某一个属性去重并且实现其中一个字段相加