使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并

这篇具有很好参考价值的文章主要介绍了使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现有两张表A表和B表,A表存放的是各省市的认证次数,B表存放的是各省市的申领次数,重点关注dq,cs这两个字段,其他的字段可忽略

使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并,Java,Map,集合,java,lambda表达式,map的key值相同合并,echarts地图省市数据统计

                                                     A表(省市认证次数表)

使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并,Java,Map,集合,java,lambda表达式,map的key值相同合并,echarts地图省市数据统计

                                                B表(省市申领次数表)

项目中有以下需求:

     现要求统计各省市的认证次数和申领次数,以及认证和申领次数之和,以此再地图上展示数据。

       A表和B表中都有dq和cs这两个字段,dq都表示行政区划编码,A表中的cs表示认证次数,B表中的cs表示申领次数,将两张表中dq值相同的分组放进同一个map中,再计算认证次数和申领次数之和,这个需求很明显就是Map要合并key的场景,将查出的数据进行合并,再分组,可使用Lambda表达式实现,部分代码如下:

Controller代码:

/**
     *  4、区域省份认证情况统计
     * @return
     */
@PostMapping(value="/loadProvinceAuthData")
    public ResponseVO loadProvinceAuthData() {
        try {
            Map<String, Object> data = new HashMap<>();
            ReportExternalRiskEntity request = new ReportExternalRiskEntity();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date=new Date();
            String startTime = sdf.format(date)+" 00:00:00";
            String endTime = sdf.format(date)+" 23:59:59";
            request.setStartTime(startTime);
            request.setEndTime(endTime);
            //List<Map<String,Object>> provinceAuthDataList = reportIdentityAuthStatService.getProvinceAuthDataList(request);
            List<Map<String,Object>> provinceAuthDataList = shenLingRenZhengService.getProvinceAuthDataList(request);
            data.put("list",provinceAuthDataList);
            return RespUtil.success(data);
        } catch (Exception e) {
            log.error("请求接口loadProvinceAuthData报错->{}",e);
            return RespUtil.sysError(String.valueOf(ResultCodeEnum.SYSTEM_ERROR));
        }
    }

 重点看Service代码中如何处理:

@Override
    public List<Map<String, Object>> getProvinceAuthDataList(ReportExternalRiskEntity request) throws Exception {
        List<Map<String, Object>> xzqhDataMapList = new ArrayList<>();

        Map queryParams = new HashMap();
        Date date=new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String queryDate = sdf.format(date);
        queryParams.put("ywrq",queryDate);
        List<Map<String, Object>> rzcsDqDataList = reportDpRzcsDqMapper.queryRzcsDqByYwrq(queryParams);//数据库查询认证次数返回的list
        List<Map<String, Object>> slcsDqDataList = reportDpSlcsDqMapper.querySlcsDqByYwrq(queryParams);//数据库查询申领次数返回的list

        PageData xzqhMap = CacheUtils.getTyZdMap(StaticVar.PROVICE_XZQH);
        if(CollectionUtils.isNotEmpty(rzcsDqDataList) && CollectionUtils.isEmpty(slcsDqDataList)){ //认证区域统计查询List有数据
            for (Map<String, Object> rzcsMap : rzcsDqDataList) {
                Map<String, Object> xzqhDataMap = new HashMap<>();
                //String authnumStr = (String) rzcsMap.get("authnum"); //注意:会报错java.math.BigDecimal cannot be cast to java.lang.Integer,先转成String类型,再转Integer
                //Integer authNum = (Integer) rzcsMap.get("authnum")==null?0:(Integer) rzcsMap.get("authnum");
                String authnumStr = StringUtils.isBlank(String.valueOf(rzcsMap.get("authnum")))?"0":String.valueOf(rzcsMap.get("authnum"));
                Integer authNum = Integer.parseInt(authnumStr);
                String rzdq = (String) rzcsMap.get("dq");
                String rzdq_bm = rzdq+StaticVar.XZQH_SUFFIX;
                xzqhDataMap.put("bm",rzdq_bm);
                xzqhDataMap.put("name",xzqhMap.get(rzdq_bm));
                xzqhDataMap.put("authNum",authNum);
                xzqhDataMap.put("applyNum",0);
                xzqhDataMap.put("totalNum",authNum);
                xzqhDataMap.put("leval",getLeval(authNum));
                xzqhDataMapList.add(xzqhDataMap);
            }
        }else if(CollectionUtils.isNotEmpty(slcsDqDataList) && CollectionUtils.isEmpty(rzcsDqDataList)){//申领区域统计查询List有数据
            for (Map<String, Object> slcsMap : slcsDqDataList) {
                Map<String, Object> xzqhDataMap = new HashMap<>();
                //Integer applyNum = (Integer) xzqhDataMap.get("applynum");
                String applynumStr = StringUtils.isBlank(String.valueOf(slcsMap.get("applynum")))?"0":String.valueOf(slcsMap.get("applynum"));
                Integer applyNum = Integer.parseInt(applynumStr);
                String sldq = (String) xzqhDataMap.get("dq");
                String sldq_bm = sldq+StaticVar.XZQH_SUFFIX;
                xzqhDataMap.put("bm",sldq_bm);
                xzqhDataMap.put("name",xzqhMap.get(sldq_bm));
                xzqhDataMap.put("authNum",0);
                xzqhDataMap.put("applyNum",applyNum);
                xzqhDataMap.put("totalNum",applyNum);
                xzqhDataMap.put("leval",getLeval(applyNum));
                xzqhDataMapList.add(xzqhDataMap);
            }
        }else if(CollectionUtils.isNotEmpty(rzcsDqDataList) && CollectionUtils.isNotEmpty(slcsDqDataList)) { //申领和认证都有数据

            for (Map<String, Object> rzcsMap : rzcsDqDataList) {
                String authnumStr = StringUtils.isBlank(String.valueOf(rzcsMap.get("authnum")))?"0":String.valueOf(rzcsMap.get("authnum"));
                Integer authNum = Integer.parseInt(authnumStr);
                rzcsMap.put("authNum",authNum);//将authnum替换为authNum
                rzcsMap.remove("authnum");//去掉那个authNum
            }

            for (Map<String, Object> slcsMap : slcsDqDataList) {
                String applynumStr = StringUtils.isBlank(String.valueOf(slcsMap.get("applynum")))?"0":String.valueOf(slcsMap.get("applynum"));
                Integer applyNum = Integer.parseInt(applynumStr);
                slcsMap.put("applyNum",applyNum);
                slcsMap.remove("applynum");
            }

            //合并,两个数据list放入一个新的list中
            List<Map<String, Object>> new_dataList = new ArrayList<>();
            new_dataList.addAll(rzcsDqDataList);
            new_dataList.addAll(slcsDqDataList);

            //先分组,将key值相同的放在一个map中
            xzqhDataMapList = new_dataList.stream()
                    .collect(Collectors.groupingBy(group -> group.get("dq").toString())) // 根据map中id的value值进行分组, 这一步的返回结果Map<String,List<Map<String, Object>>>
                    .entrySet() // 得到Set<Map.Entry<String, List<Map<String, Object>>>
                    .stream()
                    .map(m -> { // 进入映射环境
                        // m.getValue()的结果是 List<Map<String, Object>>
                        Map<String, Object> collect = m.getValue().stream()
                                // o.entrySet() 的结果是 Set<Map.Entry<String, Object>>
                                .flatMap(o -> o.entrySet().stream()).filter(e -> e.getValue() != null)//过滤下,value需要是不为空的,否则报错
                                // (m1, m2) -> m1 的意思是如果key相同 m1 == m2 则value使用m1(此处为rzcsDqDataList中的值)
                                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (m1, m2) -> m1
                                ));
                        return collect;
                    }).sorted(Comparator.comparing(m -> m.get("dq").toString())).collect(Collectors.toList());

            System.out.println("处理后的xzqhDataMapList为:"+xzqhDataMapList);
            System.out.println("处理后的xzqhDataMapList的Json为:"+ JSON.toJSONString(xzqhDataMapList));

            //处理分组后的数据,得到认证次数和申领次数之和totalNum
            for (Map<String, Object> xzqhDataMap : xzqhDataMapList) {
                String dq = (String) xzqhDataMap.get("dq");

                int totalNum = 0;
                Integer authNum = 0;
                Integer applyNum = 0 ;
                if(xzqhDataMap.containsKey("authNum")){
                    String authnumStr = StringUtils.isBlank(String.valueOf(xzqhDataMap.get("authNum")))?"0":String.valueOf(xzqhDataMap.get("authNum"));
                    authNum = Integer.parseInt(authnumStr);
                }

                if(xzqhDataMap.containsKey("applyNum")){
                    String applynumStr = StringUtils.isBlank(String.valueOf(xzqhDataMap.get("applyNum")))?"0":String.valueOf(xzqhDataMap.get("applyNum"));
                    applyNum = Integer.parseInt(applynumStr);
                }

                totalNum = authNum + applyNum;
                int level = getLeval(totalNum);
                xzqhDataMap.put("totalNum",totalNum);
                xzqhDataMap.put("level",level);
                if(!xzqhDataMap.containsKey("authNum")){ //若Map中没有"authNum",补key,"authNum"
                    xzqhDataMap.put("authNum",0);
                }

                if(!xzqhDataMap.containsKey("applyNum")){  若Map中没有"applyNum",补key,"applyNum"
                    xzqhDataMap.put("applyNum",0);
                }
                //行政区划翻译
                String xzqh_bm = dq+StaticVar.XZQH_SUFFIX;
                xzqhDataMap.put("bm",xzqh_bm);
                xzqhDataMap.put("name",xzqhMap.get(xzqh_bm));
                xzqhDataMap.remove("dq");
            }

        }
        
        return xzqhDataMapList;
    }

 //计算等级level值
  private static int getLeval(int totalNum) {
        int leval = 0;
        if(totalNum==0){
            return leval;
        }
        if(totalNum >=1 && totalNum <=900){
            leval = 1;
        }else if(totalNum >=901 && totalNum <=2000){
            leval = 2;
        }else if(totalNum >=2001 && totalNum <=4000){
            leval = 3;
        }else if(totalNum >=4001){
            leval = 4;
        }
        return leval;
    }
<!--查询认证次数返回的list-->
<select id="queryRzcsDqByYwrq" parameterType="java.util.Map" resultType="java.util.Map">
        select dq,sum(cs) as authNum from
            report_dp_rzcs_dq
        where ywrq =#{ywrq}
        group by dq
    </select>
  <!--查询申领次数返回的list-->
    <select id="querySlcsDqByYwrq" parameterType="java.util.Map" resultType="java.util.Map">
        select dq,sum(cs) as applyNum from
            report_dp_slcs_dq
        where ywrq = #{ywrq}
        group by dq
    </select>

请求接口http://127.0.0.1:8050/report/idauthstat/loadProvinceAuthData返回的数据结构如下:

{

    "data": {

        "list": [

            {

                "totalNum": 228,

                "level": 1,

                "authNum": 228,

                "name": "河北",

                "bm": "130000",

                "applyNum": 0

            },

            {

                "totalNum": 189,

                "level": 1,

                "authNum": 189,

                "name": "内蒙古",

                "bm": "150000",

                "applyNum": 0

            },

            {

                "totalNum": 356,

                "level": 1,

                "authNum": 356,

                "name": "辽宁",

                "bm": "210000",

                "applyNum": 0

            },

            {

                "totalNum": 798,

                "level": 1,

                "authNum": 662,

                "name": "吉林",

                "bm": "220000",

                "applyNum": 136

            },

            {

                "totalNum": 1260,

                "level": 2,

                "authNum": 1260,

                "name": "上海",

                "bm": "310000",

                "applyNum": 0

            },

            {

                "totalNum": 985,

                "level": 2,

                "authNum": 0,

                "name": "福建",

                "bm": "350000",

                "applyNum": 985

            },

            {

                "totalNum": 1006,

                "level": 2,

                "authNum": 0,

                "name": "江西",

                "bm": "360000",

                "applyNum": 1006

            },

            {

                "totalNum": 1209,

                "level": 2,

                "authNum": 0,

                "name": "山东",

                "bm": "370000",

                "applyNum": 1209

            },

            {

                "totalNum": 100,

                "level": 1,

                "authNum": 0,

                "name": "湖北",

                "bm": "420000",

                "applyNum": 100

            },

            {

                "totalNum": 1725,

                "level": 2,

                "authNum": 1725,

                "name": "湖南",

                "bm": "430000",

                "applyNum": 0

            },

            {

                "totalNum": 896,

                "level": 1,

                "authNum": 0,

                "name": "广东",

                "bm": "440000",

                "applyNum": 896

            },

            {

                "totalNum": 625,

                "level": 1,

                "authNum": 489,

                "name": "重庆",

                "bm": "500000",

                "applyNum": 136

            },

            {

                "totalNum": 789,

                "level": 1,

                "authNum": 0,

                "name": "四川",

                "bm": "510000",

                "applyNum": 789

            },

            {

                "totalNum": 623,

                "level": 1,

                "authNum": 623,

                "name": "陕西",

                "bm": "610000",

                "applyNum": 0

            },

            {

                "totalNum": 1024,

                "level": 2,

                "authNum": 0,

                "name": "新疆",

                "bm": "650000",

                "applyNum": 1024

            },

            {

                "totalNum": 420,

                "level": 1,

                "authNum": 420,

                "name": "台湾",

                "bm": "710000",

                "applyNum": 0

            },

            {

                "totalNum": 876,

                "level": 1,

                "authNum": 876,

                "name": "香港",

                "bm": "810000",

                "applyNum": 0

            }

        ]

    },

    "msg": "操作成功",

    "success": true,

    "code": "I000000",

    "total": null

}

统计完成,可参考 文章来源地址https://www.toymoban.com/news/detail-535117.html

到了这里,关于使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++(8.29)auto关键字,lambda表达式,数据类型转换,标准模板库,list,文件操作+Xmind

    封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个) 再把该容器中的对象,保存到文件中。 再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。  1.模板类 2.异常(异常情况为取钱时取的钱小于0或者大于余额)

    2024年02月11日
    浏览(44)
  • 【C++】Lambda表达式的使用

    例如: 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 Lambda表达式的语法 lambda表达式的底层实现涉及到闭包(Closure)的概念。闭包是一个函数对象,它可以捕获外部作用域中的变量,并在其生命周期内访问和修改这些变量。lambda表达式的底层实现就是通

    2024年02月14日
    浏览(43)
  • Java中Lambda表达式使用及详解

    Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。 Lambda表达式的使用场景:用以简化接口实现。 关于接口实现,可以有很多种方式来实现。例如:设计接口的实现类、使用匿

    2024年02月03日
    浏览(57)
  • QueryWrapper的lambda表达式使用OR

    com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架构造查询条件常用的对象 使用lambda表达式写法更为清晰,简洁: 默认情况下多个条件是and连接:上述写法对应的SQL为:where name like \\\'%aa%\\\' and age = 20 如果要使用or连接的话,方法如下: 这里引申下我遇到的一个场景:

    2024年02月13日
    浏览(36)
  • Java中使用Lambda表达式对集合排序

    先定义一个集合 或 或 或 匿名内部类方法 定义一个json数组 resultArray 注意:reversed()函数的意思是将数组颠倒。其用法常见于字符串处理中,将字符串颠倒 如: 典型的比较器示例 等价的Lambda的方式 假如我们要通过Developer 对象的年龄进行排序,通常情况下我们使用Collections

    2024年02月07日
    浏览(40)
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口         1.4 在具体代码中来操作一下         2.0 Lambda 表达式省略规则          Lambda 表达

    2024年02月08日
    浏览(52)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(83)
  • .NET写一个自己的Lambda表达式与表达式树

    LambdaExpression继承Expression Expression 又继承LambdaExpressio 所以,LambdaExpression与 Expression 的区别在于:泛型类以静态类型的方法标识了它是什么种类的表达式,也就是说,他确定了返回类型和参数。所以显然,TDelegate必须是一个委托类型。 注意 :并非所有的Lambda表达式都能转换成

    2024年02月13日
    浏览(46)
  • 【JAVA】包装类、正则表达式、Arrays类、Lambda表达式

    包装类是8种基本数据类型对应的引用类型 作用:后期的集合和泛型不支持基本类型,只能使用包装类 基本数据类型和其对应的引用数据类型的变量可以互相赋值 基本数据类型 引用数据类型 byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean 包装类

    2024年02月13日
    浏览(56)
  • 23.Lambda表达式

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。Lambda表达式是Java SE 8中一个重要的新特性。

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包