java8 list map 聚合求和

目标:

统计地市的总的完成数量,并根据总数来排序。

要把下面的数据:

[{"city_name": "南京市","carrier_id": "2","carrier_name": "移动","city_id": "0","finish_num": 14},{"city_name": "南京市","carrier_id": "5","carrier_name": "移动转售企业","city_id": "0","finish_num": 1},{"city_name": "南京市","carrier_id": "6","carrier_name": "长城宽带","city_id": "0","finish_num": 1},{"city_name": "南京市","carrier_id": "7","carrier_name": "增值电信企业","city_id": "0","finish_num": 1},{"city_name": "无锡市","carrier_id": "1","carrier_name": "电信","city_id": "1","finish_num": 3},{"city_name": "镇江市","carrier_id": "1","carrier_name": "电信","city_id": "10","finish_num": 1}, {"city_name": "常州市","carrier_id": "2","carrier_name": "移动","city_id": "3","finish_num": 1},{"city_name": "常州市","carrier_id": "1","carrier_name": "电信","city_id": "3","finish_num": 1},{"city_name": "常州市","carrier_id": "5","carrier_name": "移动转售企业","city_id": "3","finish_num": 1} 
]

目标格式:
 

[{"city_name": "南京市","total": 17,"city_id": "0"},{"city_name": "常州市","total": 5,"city_id": "3"},{"city_name": "无锡市","total": 3,"city_id": "1"}
]

处理:

模拟数据:

public static List<Map<String, Object>> initData() {String data = "[\n" +"\t{\n" +"\t\t\"city_name\": \"南京市\",\n" +"\t\t\"carrier_id\": \"2\",\n" +"\t\t\"carrier_name\": \"移动\",\n" +"\t\t\"city_id\": \"0\",\n" +"\t\t\"finish_num\": 14\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"南京市\",\n" +"\t\t\"carrier_id\": \"5\",\n" +"\t\t\"carrier_name\": \"移动转售企业\",\n" +"\t\t\"city_id\": \"0\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"南京市\",\n" +"\t\t\"carrier_id\": \"6\",\n" +"\t\t\"carrier_name\": \"长城宽带\",\n" +"\t\t\"city_id\": \"0\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"南京市\",\n" +"\t\t\"carrier_id\": \"7\",\n" +"\t\t\"carrier_name\": \"增值电信企业\",\n" +"\t\t\"city_id\": \"0\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"无锡市\",\n" +"\t\t\"carrier_id\": \"1\",\n" +"\t\t\"carrier_name\": \"电信\",\n" +"\t\t\"city_id\": \"1\",\n" +"\t\t\"finish_num\": 3\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"镇江市\",\n" +"\t\t\"carrier_id\": \"1\",\n" +"\t\t\"carrier_name\": \"电信\",\n" +"\t\t\"city_id\": \"10\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"宿迁市\",\n" +"\t\t\"carrier_id\": \"3\",\n" +"\t\t\"carrier_name\": \"联通\",\n" +"\t\t\"city_id\": \"12\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"外省\",\n" +"\t\t\"carrier_id\": \"1\",\n" +"\t\t\"carrier_name\": \"电信\",\n" +"\t\t\"city_id\": \"13\",\n" +"\t\t\"finish_num\": 3\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"徐州市\",\n" +"\t\t\"carrier_id\": \"3\",\n" +"\t\t\"carrier_name\": \"联通\",\n" +"\t\t\"city_id\": \"2\",\n" +"\t\t\"finish_num\": 2\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"常州市\",\n" +"\t\t\"carrier_id\": \"2\",\n" +"\t\t\"carrier_name\": \"移动\",\n" +"\t\t\"city_id\": \"3\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"常州市\",\n" +"\t\t\"carrier_id\": \"1\",\n" +"\t\t\"carrier_name\": \"电信\",\n" +"\t\t\"city_id\": \"3\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"常州市\",\n" +"\t\t\"carrier_id\": \"5\",\n" +"\t\t\"carrier_name\": \"移动转售企业\",\n" +"\t\t\"city_id\": \"3\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"常州市\",\n" +"\t\t\"carrier_id\": \"6\",\n" +"\t\t\"carrier_name\": \"长城宽带\",\n" +"\t\t\"city_id\": \"3\",\n" +"\t\t\"finish_num\": 1\n" +"\t},\n" +"\t{\n" +"\t\t\"city_name\": \"常州市\",\n" +"\t\t\"carrier_id\": \"7\",\n" +"\t\t\"carrier_name\": \"增值电信企业\",\n" +"\t\t\"city_id\": \"3\",\n" +"\t\t\"finish_num\": 1\n" +"\t}\n" +"]";return changeFormat(data);}private static List<Map<String,Object>> changeFormat(String areaInfo){JSONArray areaArr = JSONArray.parseArray(areaInfo);return ListUtils.emptyIfNull(areaArr).stream().map(e -> (JSONObject) e).map(e -> (Map<String, Object>)JSONObject.parseObject( e.toJSONString())).collect(Collectors.toList());}

方式一: 分布处理

先根据市进行聚合,再根据数量进行求和

  Map<String, List<Map<String, Object>>> cityGroup = ListUtils.emptyIfNull(cityCarrier).stream().collect(Collectors.groupingBy(e -> e.get("city_id").toString()));Map<String, Integer> citySumMap = MapUtils.emptyIfNull(cityGroup).entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, t -> 
ListUtils.emptyIfNull(t.getValue()).stream().mapToInt(f -> 
MapUtils.getInteger(f, "finish_num")).sum()));System.out.println(citySumMap);

 能分步处理,说明可以聚合到一起处理

方式二:聚合处理

Map<String, IntSummaryStatistics> citySumMap2 = 
ListUtils.emptyIfNull(cityCarrier).stream()          
.collect(Collectors.groupingBy(e -> e.get("city_id").toString(),                  
Collectors.summarizingInt(f -> MapUtils.getInteger(f, "finish_num"))));

汇总:

public static void main(String[] args) {List<Map<String, Object>> cityCarrier = initData();Map<String, String> cityNameMap = ListUtils.emptyIfNull(cityCarrier).stream().collect(Collectors.toMap(e -> MapUtils.getString(e, "city_id"), f -> MapUtils.getString(f, "city_name"), (x, y) -> x));Map<String, IntSummaryStatistics> citySumMap2 = ListUtils.emptyIfNull(cityCarrier).stream().collect(Collectors.groupingBy(e -> e.get("city_id").toString(),Collectors.summarizingInt(f -> MapUtils.getInteger(f, "finish_num"))));List<Map<String, Object>> cityCountData = MapUtils.emptyIfNull(cityNameMap).entrySet().stream().map(e -> {String key = e.getKey();Map<String, Object> temp = new HashMap<>();temp.put("city_id", key);temp.put("city_name", e.getValue());temp.put("total", citySumMap2.get(key).getSum());return temp;}).collect(Collectors.toList());List<Map<String, Object>> result = ListUtils.emptyIfNull(cityCountData).stream().sorted((c1, c2) -> MapUtils.getDouble(c2, "total").compareTo(MapUtils.getDouble(c1, "total"))).collect(Collectors.toList());System.out.println(JSON.toJSONString(result));}

输出:

[{"city_name": "南京市","total": 17,"city_id": "0"},{"city_name": "常州市","total": 5,"city_id": "3"},{"city_name": "无锡市","total": 3,"city_id": "1"},{"city_name": "外省","total": 3,"city_id": "13"},{"city_name": "徐州市","total": 2,"city_id": "2"},{"city_name": "宿迁市","total": 1,"city_id": "12"},{"city_name": "镇江市","total": 1,"city_id": "10"}
]

这样就达到目的了。

总结:

        list map 聚合求和,要熟悉第二种方式处理方式,写法比较简便。想不到就用第一种的方式,肯定可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的systemd/service

开机自启任务 一. 概述 systemd 是现代 Linux 系统中管理系统和用户服务的工具&#xff0c;可以创建一个 systemd 服务来实现开机自启的任务 二. 操作 1. 创建 systemd 服务文件 使用文本编辑器创建一个新的服务文件&#xff1a; sudo vim /etc/systemd/system/test.servi…

医学影像类和医用电气设备测试标准整理

医学影像类和医用电气设备测试标准整理 1、GB 9706.225-2022 医用电气设备 第2-25部分:心电图机的基本安全和基本性能专用要求 GB 9706.225规定了在201.3.63中定义的通过自身或作为ME系统一部分,提供可供诊断用的心电图报告的心电图机基本安全和基本性能,以下称为ME设备。 …

git cherry-pick 小技巧

假设您现在的工作分支是 master&#xff0c;并且您想从远程仓库的 master 分支只挑选两个特定的 commit&#xff08;例如 2343434 和 55676788&#xff09;来更新您的本地分支&#xff0c;然后将更新后的结果强制推送回远程仓库。 ### 详细操作步骤1. **切换到您的工作分支**:b…

鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元

目录 前言 HarmonyOS NEXT&#xff1a;下一代操作系统的愿景 1、核心特性和优势 2、如何推动应用生态的发展 3、对开发者和用户的影响 华为云服务在鸿蒙原生应用开发中的作用 1、华为云ECS C系列实例 &#xff08;1&#xff09;全维度性能升级 &#xff08;2&#xff…

3^100的位数判断

3^100的位数判断 问题来源 字节面试&#xff0c;面试官提问&#xff1a;口算估计3^100的位数&#xff0c;或是给出位数估计范围。 解决方案 方法一&#xff1a; 该方法纯口算&#xff0c;可得一个较为准确的一个范围 2 100 < 3 100 < 4 100 2^{100}<3^{100}<…

ROS2简介与Ubuntu24.04中安装指南

之前安装了一个版本&#xff0c;但是不愿意写blog&#xff0c;现在想想自己就是个沙子立个flag&#xff0c;每次配置项目&#xff0c;写流程blog ROS简介 ROS&#xff08;Robot Operating System&#xff09;是一个开源的机器人软件平台&#xff0c;提供了许多工具和库来帮助…

Linux sudo命令及权限设置

普通用户的权限是有限制的&#xff0c;需要更大的权限&#xff0c;就需要使用 root 用户&#xff0c;但又不想一直使用 root 用户&#xff0c;如普通用户查看 8080 端口的监听情况&#xff1a; netstat -tulnp | grep :8080 只能查看自己的 不想用 root 用户&#xff0c;继续…

uniapp h5端临时路径转file对象上传

文章目录 问题说明使用说明1.使用场景2. 文件需要压缩3. 使用技术4. 代码如下5. utils/index.js 代码 3. 总结说明 问题说明 只针对uniapp开发H5网页,使用uniapp api获取到的临时路径不能满足使用场景,其他平台未进行测试 使用说明 1.使用场景 使用uview-ui的u-upload组件上…

微服务网关的认证管理;原理与实践

API安全认证是网关的最重要能力 API 网关为了保护对外提供的API&#xff0c;避免诸如恶意访问、未授权访问、应用漏洞及黑客攻击等导致的数据和资产损失&#xff0c;采用API网关的认证机制显得十分必要。 这种认证机制通过基于token的身份验证来实现&#xff0c;它允许应用程…

C++学习笔记2----模板类、继承、struct在class内定义相关问题记录

背景&#xff1a;写的算法合并到项目组代码&#xff0c;编译发现一些以前没积累过的错误&#xff0c;这里记录下&#xff0c;也供大家参考。 一、问题1 // 每个类都有单独的.h .cpp class A; class B : public A {// ... }; class C : public A {// ... };若在B.h中引用了一个…

STM32 + CubeMX + 硬件SPI + W5500 +TcpClient

这篇文章记录一下STM32W5500TCP_Client的调试过程&#xff0c;实现TCP客户端数据的接收与发送。 目录 一、W5500模块介绍二、Stm32CubeMx配置三、Keil代码编写1、添加W5500驱动代码到工程&#xff08;添加方法不赘述&#xff0c;驱动代码可以在官网找&#xff09;2、在工程中增…

微信小程序中,点击视频,没有跳转播放,可能是因为没有在app.json中正确注册视频播放页面的路径

const customMethodMap {handlePreview(e) {const { item: { url } } e?.currentTarget?.datasetconsole.log(Clicked item URL:, url); // 输出URLconst type url.split(.)[url.split(.)?.length - 1]console.log(File type:, type); // 输出文件类型console.log(isDoc(…

软件体系结构

第一章 构件 具有某种功能的 可复用的软件结构单元,为组装服务,可部署,具有规范的接口规约和显式的语境依赖 构件模型 构件模型是对构件本质特征的抽象描述&#xff0c;可以把它想象成一个类的组合&#xff0c;它封装了多个类&#xff0c;并具有一个或多个服务而提供了简单…

什么是垃圾回收(Garbage Collection)?

垃圾回收&#xff08;Garbage Collection&#xff09;是一种自动管理内存的机制&#xff0c;在编程语言中&#xff0c;它负责自动检测和释放不再被程序使用的内存&#xff0c;以避免内存泄漏和内存碎片的问题。 以下是一段示例代码&#xff1a; public class Example {public…

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 &#xff08;一&#xff09;理解 Standalone 集群架构 &#xff08;二&#xff09;Standalone 集群部署 二、打开监控界面 &#xff08;一&#xff09;master监控界面 &#xff08;二&#xff09;日志服务监控界面 三、集群的测试 &a…

react的antd-mobile使用Steps显示物流

antd-mobile的图标&#xff0c;是需要安装依赖的 step如果只有一个步骤是不会展示的&#xff0c;代码里面的标题那块可以看出来 尝试了很多遍测试发现一直不显示&#xff0c;查询后发现是这个组件的本身设置的原因 那么就算你只展示一个那么也要写两个step&#xff0c;第二个…

基于鸟类AI识别的果园智能物联网解决方案

1. 项目背景 我国拥有广阔的果园种植面积&#xff0c;但每年因鸟类造成的损失高达数亿元。传统的防鸟害措施&#xff0c;如建立防护网和使用物理化学方法&#xff0c;效果并不理想&#xff0c;且成本较高。为了解决这一问题&#xff0c;深圳快瞳科技有限公司的提出基于鸟类AI识…

uniapp 使用vue/pwa

vue add vue/pwa src下创建service-worker.js /* eslint-disable no-undef*/ importScripts(https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js) if (workbox) {console.log(Yay! Workbox is loaded &#x1f389;) } else {console.log(Boo! Workbo…

Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性

摘要&#xff1a; 在分布式系统中&#xff0c;接口的幂等性至关重要&#xff0c;它能确保重复请求不会导致意外的副作用。本文深入探讨了 Java 实现接口幂等的九种方法&#xff0c;包括数据库唯一约束、状态机、分布式锁等&#xff0c;并通过详细的代码示例和实际应用场景&…

让Erupt框架支持.vue文件做自定义页面模版

Erupt是什么&#xff1f; Erupt 是一个低代码 全栈类 框架&#xff0c;它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。 零前端代码、零 CURD、自动建表&#xff0c;仅需 一个类文件 简洁的注解配置&#xff0c;快速开发企业级 Admin 管理后台。 提…