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

原文地址:https://www.cnblogs.com/lzfhope/p/14186561.html