• 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

  • 相关阅读:
    ASP.NET Web API 记录请求响应数据到日志的一个方法
    EF删除集中方法对比
    CSS 的优先级机制[总结]
    sql备份命令
    sql两张表关联更新字段
    VSCode隐藏node_modules目录
    C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
    模拟退火(转)
    HNOI2006-鬼谷子的钱袋
    HNOI2006-公路修建问题(二分答案+并查集)
  • 原文地址:https://www.cnblogs.com/lzfhope/p/14186561.html
Copyright © 2020-2023  润新知