• Java8 stream 中利用 groupingBy 进行多字段分组


    1、利用stream对数据进行分组并求和

        public static void main(String[] args) {
            List<String> items = Arrays.asList("apple", "apple", "banana", "apple", "orange", "banana", "papaya");
    //        Map<String,Long> map = items.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
            Map<String,Long> map = items.stream().collect(Collectors.groupingBy(t->t,Collectors.counting()));
            System.out.println(JSON.toJSONString(map));
        }
    

     输出结果:{"papaya":1,"orange":1,"banana":2,"apple":3}

     2、

    在实际需求中,我们可能需要对一组对象进行分组,而且分组的条件有多个。比如对国家和产品类型进行双重分组,一种比较复杂的方法是先对产品类型进行分组,然后对每一个产品类型中的国际名进行分组求和。

    转换前的对象:

    @Data
    public class GameMusicVO implements Serializable {
    
        /**
        * 游戏Id
        **/
        private Integer gameId;
    
        /**
        * 音乐Id
        **/
        private Integer musicId;
        /**
         * 音乐code
         **/
        private String musicCode;
    
        /**
        * 音乐配置名称
        **/
        private String codeName;
    
        /**
         * 音乐名称
         **/
        private String musicName;
    
        /**
         * 音乐大小
         **/
        private Float size;
    
        /**
         * 音乐长度
         **/
        private Long timeLength;
    
        /**
         * 存储的路径
         **/
        private String path;
    
        /**
        * 是否选中
        **/
        private String value;
    }
    

      

    转换后的格式:

    @Data
    public class GameNewMusicVO implements Serializable {
        /**
         * 音乐code
         **/
        private String code;
    
        /**
         * 音乐配置名称
         **/
        private String codeName;
        /**
         * 音乐列表
         **/
        private List<GameMusicVO> children;
    }

    转换代码:

     List<GameMusicVO> musicList = new ArrayList<>();
              //自己添加list
    
                Map<String, List<GameMusicVO>> menuGroupMap = musicList.stream().collect(Collectors.groupingBy(GameMusicVO::getMusicCode));
                List<GameNewMusicVO> musicNewVOList = menuGroupMap.keySet().stream().map(key -> {
                    GameNewMusicVO temp = new GameNewMusicVO();
                    temp.setCode(key);
    //这里虽然code与codeName是一对一,但还需要再查询一次。 //temp.setCodeName(GameStringUtils.matchCodeName(key,musicCodeVOList)); temp.setChildren(menuGroupMap.get(key));
    return temp; }).collect(Collectors.toList());

    优化代码:

    Map<String, List<GameMusicVO>> menuGroupMap = musicList.stream().collect(Collectors.groupingBy(v -> v.getMusicCode() + "_" + v.getMusicName()));
                List<GameNewMusicVO> musicNewVOList = menuGroupMap.keySet().stream().map(key -> {
                    String[] keyArr = key.split("_");
                    String code = keyArr[0];
                    String codeName = keyArr[1];
                    GameNewMusicVO temp = new GameNewMusicVO();
                    temp.setCode(code);
                    temp.setCodeName(codeName);
                    temp.setChildren(menuGroupMap.get(key));
                    return temp;
                }).collect(Collectors.toList());
    

      

  • 相关阅读:
    英特尔“硬盘内存一体化”首款产品正式发布,读写速度超千倍,存储密度扩充十倍
    程序员,你为什么值这么多钱?
    不懂程序看的明白《黑客帝国》吗?
    程序员的工作、学习与绩效
    架构设计师能力模型
    .net平台的MongoDB使用
    转载-30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)
    XAF-DevExpress.ExpressApp.DC.Xpo.XpoTypeInfoSource 生成实体的过程-学习笔记
    谈谈敏捷开发
    XAF-由于try catch导致的性能问题一例
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14073911.html
Copyright © 2020-2023  润新知