Java8stream中利⽤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().upingBy(Function.identity(),unting()));
Map<String,Long> map = items.stream().upingBy(t->unting()));
System.out.JSONString(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
java streampublic 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().upingBy(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.(key));
return temp;
}).List());
优化代码:
Map<String, List<GameMusicVO>> menuGroupMap = musicList.stream().upingBy(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.(key));
return temp;
}).List());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论