Java8 stream 中利用 groupingBy 進行多欄位分組
阿新 • • 發佈:2020-12-02
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 = newArrayList<>(); //自己新增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());