一、分析

实际应用场景,list中的元素的某个属性是重复的,因此可以按照此元素对list进行分组,最终放到Map集合,此元素为key值,分组后的list为value值

二、实现代码

2.1普通方法
    public static Map<String,List<User>> splitGroup(List<User> list){
        //初始化一个map
        Map<String,List<User>> map = new HashMap<>();
        for(User user : list){
            String key = user.getId();
            if(map.containsKey(key)){
                //如果map中存在以此id作为的key,将数据元素存放当前key的list集合中
                map.get(key).add(user);
            }else{
                //map中不存在以此id作为的key,新建key用来存放数据
                List<User> userList = new ArrayList<>();
                userList.add(user);
                map.put(key,userList);
            }
        }
        return map;
    }
2.2Stream流

一行代码搞定

Map<String,List<User>> stringListMap = list.stream().collect(Collectors.groupingBy(User::getId));

三、测试代码及测试结果

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        //当前测试以id来分组,User实体类中成员变量有id及name,全参构造方法,toString方法
        list.add(new User("1", "1"));
        list.add(new User("1", "2"));
        list.add(new User("2", "2"));
        list.add(new User("2", "3"));
        list.add(new User("2", "4"));
        list.add(new User("3", "3"));
        
        //测试普通方法
        //Map<String, List<User>> stringListMap = splitGroup(list);
        
        //测试stream流
        Map<String,List<User>> stringListMap = list.stream().collect(Collectors.groupingBy(User::getId));        

        //将map集合转为set集合遍历
        Set<Map.Entry<String, List<User>>> entries = stringListMap.entrySet();
        for(Map.Entry m : entries){
            System.out.println(m);
        }
    }

测试的结果如下
在这里插入图片描述
参考博客

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐