码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-12-07 12:34:17      阅读:8      评论:0      收藏:0      [点我收藏+]

标签:split   一对一   func   ble   name   print   产品   icc   条件   

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());

  

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

标签:split   一对一   func   ble   name   print   产品   icc   条件   

原文地址:https://www.cnblogs.com/maohuidong/p/14073911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!