java 8 stream toMap問題
阿新 • • 發佈:2020-12-24
最近使用java的stream功能有點多,理由有2:
1)少寫了不少程式碼
2)在效能可以接受的範圍內
在巨大的collection基礎上使用stream,沒有什麼經驗。所以非關鍵業務上,樂於使用stream。
--
工作中常常使用toMap,而且嚐嚐需要把ListMap轉為Map<String,List<Map<String,Object>>>
之所以這麼做,主要兩個理由:
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格式化了下):
[ { "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":"男" } ] { "烏魯木齊":[ { "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