1. 程式人生 > 實用技巧 >java 8 stream toMap問題

java 8 stream toMap問題

最近使用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