1、利用stream对数据进行分组并求和
1 2 3 4 5 6 | 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、
在实际需求中,我们可能需要对一组对象进行分组,而且分组的条件有多个。比如对国家和产品类型进行双重分组,一种比较复杂的方法是先对产品类型进行分组,然后对每一个产品类型中的国际名进行分组求和。
转换前的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | @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());
优化代码:
1 2 3 4 5 6 7 8 9 10 11 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2018-12-02 MySQL大数据量分页查询方法及其优化