Skip to main content
 首页 » 编程设计

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

2022年07月18日138java哥

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

  


本文参考链接:https://www.cnblogs.com/maohuidong/p/14073911.html
阅读延展