• stream流—关于Collectors.toMap使用详解


    使用规则:

    toMap(Function, Function) 返回一个 Collector,它将元素累积到一个 Map中,其键和值是将提供的映射函数应用于输入元素的结果。

    如果映射的键包含重复项,则在执行收集操作时会抛出IllegalStateException

    1.将list转成以id为key的map,value是id对应的某对象

     Map<String, Map<String, Object>> lineOffMap = tmlLineOffBySubIdList.stream().
     collect(Collectors.toMap(map -> map.get("subs_id").toString(), value -> value));
    
    • 1
    • 2

    解释:
    将tmlLineOffBySubIdList转化为key=subs_id,value=subs_id的这条记录,也就是某个对象用
    Map存储;
    (这么做的目的就是最后我们要根据这个key也就是subs_id,去和主键为subs_id列表进行一个嵌套匹配)

    举例
    在这里插入图片描述

    2.假如id存在重复值,则会报错Duplicate key xxx

    处理方法:可以使用分组

    3.想获得一个id和name对应的Map

    Map<String, String> map = list.stream().
    collect(Collectors.toMap(Student.getId(),Student.getName()));
    
    • 1
    • 2
    3.1 name为空时null
    • name可以为空字符串但不能为null,否则会报空指针;
    • 解决方案:使用三目运算符
    Map<String, String> map = list.stream().
    collect(Collectors.toMap(Student.getId(), e->e.getName()==null?"":e.getName()));
    //这里的e也可以是其他字母 如 o -> o.getNmae() == null ? "" : e.getName()
    
    • 1
    • 2
    • 3
    3.2 id重复时
    • 假如存在id重复,两个vaue可以这样映射到同一个id
    Map<String, String> map = list.stream().
    collect(Collectors.toMap(Student.getId(),Student.getName(),
    (e1,e2)->e1+","+e2));
    
    • 1
    • 2
    • 3

    4.分组 使用groupingby

    • 把Student集合按照班级分组到map中
    Map<String,List<Student>> map= list.stream().
    collect(Collectors.groupingby(Student.getClass()));
    
    • 1
    • 2

    举例

    • category货品,一个货品含有多个货物
    • category_id货品id
    • goods货物,一条货物记录也就是一个货物对象里面含有其上属的货品id
    • 场景:查出货品列表;查出货物列表
    • 目的:要根据货品把相应的货物匹配嵌套到货品的信息里面:像下面的样子
    category_good_list[
    		{
    		category_id=1[
    				{
    					category_id=1
    					货物1
    				}{
    					category_id=1
    					货物2
    				}
    			]
    		},
    		{
    		category_id=2[
    				{
    					category_id=2
    					货物3
    				}{
    					category_id=2
    					货物4
    				}
    			]
    		},
    	timestamp:12873238123123
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    第一步:

     Map<String, List<Map<String, Object>>> categoryIdMap = 
     orderOutCategoryGoodsList.stream().
     collect(Collectors.groupingBy(map -> map.get("category_id").toString()));
    //根据货物里面的category_id 进行分组;因为一个货品可能有多个货物;
    
    • 1
    • 2
    • 3
    • 4

    分组结果如下:
    在这里插入图片描述

    第二步:

    根据货品id,也就是category_id 和货品list进行匹配,因为已经分组了,所以货品id是唯一的;

    for (Map<String, Object> tempCategoryMap : orderOutCategoryList) {
        String categoryId = tempCategoryMap.get("category_id").toString();
        tempCategoryMap.put("goodsList", categoryIdMap.get(categoryId));
        categoryAndGoodsList.add(tempCategoryMap);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    利用货品id把相应货物塞到货品列表里面,这样就可以得到,货品列表及其货品底下的货物列表(相当于树结构,枝干和它的孩子枝叶)


    其他

    List<Map<String, Object>> queryMapList = xxxService.queryMapList("statement", paraMap);
    查到结果是list
       meter_id
    23080800000066
    23080800000067
    23080800000068
    
    stream流的使用:
    String meterId = queryMapList.stream().map(map -> map.get("meter_id").toString()).
    collect(Collectors.joining(","));
    分解介绍:queryMapList.stream()调用流
        	map(map -> map.get("meter_id")获取key也就是"meter_id"对应的每一个值
            collect(Collectors.joining(","));最后要加上collect()这个一般是放在最后面使用的
            Collectors.joining(",")  再利用"," 把每一个value拼接起来
    最后就得到结果:String meterId ="23080800000066,23080800000067,23080800000068"
                
                
    //要是还想得到 " meter_id" 为key "23080800000066,23080800000067,23080800000068"
     为value的形式
      就再new一个map即可:如下
          Map<String, Object> hashMap = new HashMap<String, Object>();
          hashMap.put("meter_id", meterId);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    前端模块化
    佳能e478打印机怎么连接wifi
    蓝海彤翔亮相2023新疆网络文化节重点项目“新疆动漫节”
    Day11:二叉树---->满~、完全~、堆
    使用js原生customElements.define()API 实现类似godot游戏引擎的colorRect类
    聊聊交互设计师的成长 优漫动游
    Go学习第十二章——Go反射与TCP编程
    管理多个项目的主要挑战与应对方法
    [车联网安全自学篇] 四十九. Android安全之IPC机制敏感信息挖掘
    web综合案例-day01
  • 原文地址:https://blog.csdn.net/m0_48904153/article/details/134093380