java 8 stream toMap问题
最近使用java的stream功能有点多,理由有2:
1)少写了不少代码
2)在性能可以接受的范围内
在巨大的collection基础上使用stream,没有什么经验。而非关键业务上,乐于使用stream。
--
工作中常常需要把ListMap转为Map<String,List<Map<String,Object>>>,所以用toMap。
之所以这么做,主要两个理由:
1)业务需要
2)愿意使用key去寻找,而不是重复遍历数组。完成的代码比较友好,容易看,也容易理解。比较文字比数字友好
例子:
package com.hc.demomain.base.stream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import com.alibaba.fastjson.JSONObject; public class StreamTest { public static void main(String[] args) { List<Map<String,Object>> stuList=new ArrayList<Map<String,Object>>(); Map<String,Object> a1=new HashMap<String,Object>(); a1.put("className", "fujian"); a1.put("name", "a1"); a1.put("sex", "男"); stuList.add(a1); Map<String,Object> a2=new HashMap<String,Object>(); a2.put("className", "fujian"); a2.put("name", "a2"); a2.put("sex", "女"); stuList.add(a2); Map<String,Object> b1=new HashMap<String,Object>(); b1.put("className", "beijing"); b1.put("name", "b1"); b1.put("sex", "男"); stuList.add(b1); Map<String,Object> b2=new HashMap<String,Object>(); b2.put("className", "beijing"); b2.put("name", "b2"); b2.put("sex", "女"); stuList.add(b2); Map<String,Object> c1=new HashMap<String,Object>(); c1.put("className", "乌鲁木齐"); c1.put("name", "c1"); c1.put("sex", "女"); stuList.add(c1); Map<String,Object> c2=new HashMap<String,Object>(); c2.put("className", "乌鲁木齐"); c2.put("name", "c2"); c2.put("sex", "男"); stuList.add(c2); //使用className分组 Map<String,List<Map<String,Object>>> destMap= stuList.stream().collect(Collectors.toMap( item->item.get("className").toString(),v->{ List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); Map<String,Object> m=new HashMap<String,Object>(); m.put("name",v.get("name")); m.put("sex",v.get("sex")); list.add(m); return list; }, //重複處理 (List<Map<String,Object>> oldList, List<Map<String,Object>> newList) -> { oldList.addAll(newList); return oldList; } ) );
JSONArray srcObject = (JSONArray)JSONObject.toJSON(stuList);
System.out.println(JSONObject.toJSONString(srcObject, true));
JSONObject jsonObject = (JSONObject)JSONObject.toJSON(destMap); System.out.println(JSONObject.toJSONString(jsonObject, true)); } }
以下是原始的ListMap和转换后Map<String,List<Map<String,Object>>> 的对比(为了方便阅读,使用fastJson格式化了下):
原始的ListMap:
[ { "name":"a1", "className":"fujian", "sex":"男" }, { "name":"a2", "className":"fujian", "sex":"女" }, { "name":"b1", "className":"beijing", "sex":"男" }, { "name":"b2", "className":"beijing", "sex":"女" }, { "name":"c1", "className":"乌鲁木齐", "sex":"女" }, { "name":"c2", "className":"乌鲁木齐", "sex":"男" } ]
通过toMap转换后获得的Map<String,List<Map<String,Object>>>:
{ "乌鲁木齐":[ { "name":"c1", "sex":"女" }, { "name":"c2", "sex":"男" } ], "beijing":[ { "name":"b1", "sex":"男" }, { "name":"b2", "sex":"女" } ], "fujian":[ { "name":"a1", "sex":"男" }, { "name":"a2", "sex":"女" } ] }
下次有机会,专门比较下,不同写法的效率!
不过已经有人做过了试验,https://www.cnblogs.com/jpfss/p/11262231.html
分类:
java
标签:
java stream
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇
2019-12-24 谈谈数据库sql编写