扫码关注官方订阅号
正文
0
碧海醫心
发布时间:2025-09-27 10:29:46
925人浏览过
来源于php中文网
原创
在日常的java开发中,我们经常会遇到需要处理复杂数据结构的情况。其中一种常见场景是拥有一个list>,其中每个map代表一条记录,包含多个键值对。例如,一个交易列表可能包含“trip id”、“account”和“charged fare”等信息。当我们需要根据某个特定字段(例如“account”)将这些记录进行分组时,传统的迭代方法可能会显得冗长且效率低下。java 8引入的stream api为这类操作提供了强大且简洁的解决方案。
示例数据结构:
假设我们有以下交易数据,存储在一个List>中:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Collection; import java.util.stream.Collectors; public class DataGroupingExample { public static void main(String[] args) { List> dataListMap = new ArrayList<>(); // 交易1 Map dataMap1 = new HashMap() {{ put("Charged fare", "3"); put("Trip ID", "1"); put("Account", "220"); }}; dataListMap.add(dataMap1); // 交易2 Map dataMap2 = new HashMap() {{ put("Charged fare", "5"); put("Trip ID", "2"); put("Account", "220"); }}; dataListMap.add(dataMap2); // 交易3 Map dataMap3 = new HashMap() {{ put("Charged fare", "7"); put("Trip ID", "3"); put("Account", "230"); }}; dataListMap.add(dataMap3); // 交易4 Map dataMap4 = new HashMap() {{ put("Charged fare", "8"); put("Trip ID", "4"); put("Account", "230"); }}; dataListMap.add(dataMap4); System.out.println("原始数据列表:"); dataListMap.forEach(System.out::println); System.out.println("\n---"); // 接下来的分组和重组操作将基于此dataListMap } }
我们的目标是根据"Account"键的值,将dataListMap中的元素分组,最终得到一个List>>,其中每个内部列表包含属于同一个账户的所有交易记录。
Java Stream API提供了一个强大的收集器Collectors.groupingBy(),它可以轻松实现基于某个属性的元素分组。
立即学习“Java免费学习笔记(深入)”;
分组实现:
// 继续上面的main方法 // 根据"Account"键的值对列表进行分组 List>> groupedByAccount = new ArrayList<>(dataListMap.stream() .collect(Collectors.groupingBy(item -> item.get("Account"))) .values()); System.out.println("按账户分组后的数据:"); groupedByAccount.forEach(list -> { System.out.println("--- 账户组 ---"); list.forEach(System.out::println); }); System.out.println("\n---");
代码解析:
输出示例:
国内⼀体化视频⽣产平台
按账户分组后的数据: --- 账户组 --- {Charged fare=3, Trip ID=1, Account=220} {Charged fare=5, Trip ID=2, Account=220} --- 账户组 --- {Charged fare=7, Trip ID=3, Account=230} {Charged fare=8, Trip ID=4, Account=230}
在某些场景下,我们可能需要将已经分组的List>>重新合并回一个单一的List>。虽然在大多数情况下,如果原始列表仍然可用,直接使用原始列表更简单,但了解如何进行这种“扁平化”操作仍然很有用,尤其是在数据经过转换或过滤后。
扁平化实现:
// 继续上面的main方法 // 将分组后的数据重新扁平化为一个列表 List> regroupedList = groupedByAccount.stream() .flatMap(Collection::stream) .collect(Collectors.toList()); System.out.println("重新扁平化后的数据:"); regroupedList.forEach(System.out::println); System.out.println("\n---");
重新扁平化后的数据: {Charged fare=3, Trip ID=1, Account=220} {Charged fare=5, Trip ID=2, Account=220} {Charged fare=7, Trip ID=3, Account=230} {Charged fare=8, Trip ID=4, Account=230}
可以看到,结果与原始的dataListMap在内容上是一致的。
// 过滤掉Account为null的记录再分组 List>> groupedFiltered = new ArrayList<>(dataListMap.stream() .filter(item -> item.get("Account") != null) .collect(Collectors.groupingBy(item -> item.get("Account"))) .values());
本教程演示了如何使用Java Stream API高效地对List>进行分组和重组。Collectors.groupingBy()是实现复杂数据分组的强大工具,而flatMap()则提供了将多层集合扁平化的能力。掌握这些Stream操作将极大地提升你在Java中处理集合数据的效率和代码质量。记住,Stream API以其非侵入性和函数式编程风格,为现代Java开发带来了革命性的改变。
相关文章
在Java里如何处理数组越界问题_Java数组访问安全说明
Java中实现类似printf风格的多参数字符串格式化
如何将任意 JSON 自动转换为可反序列化的标准 XML(含集合项命名包装)
Java Stream 中如何单次遍历实现多条件过滤与分类处理
在Java里如何使用final类防止继承_Java继承控制策略说明
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
重制信号?育碧重新上传《刺客信条4:黑旗》音乐原声带
2026-01-15 15:21
如何为多维嵌套数组中的每个子元素自动添加 parent_id 字段
2026-01-15 15:24
红魔高管喊话友商:所有跟进风扇的友商都欠红魔一句感谢
2026-01-15 15:25
Loguru 动态注入请求上下文实现 FastAPI 每请求日志格式定制
2026-01-15 15:27
曝Eidos 蒙特利尔疑似秘密开发“4A”级游戏项目!
2026-01-15 15:28
京东联盟app推广位置在哪
2026-01-15 15:29
Apple Watch充电器成美甲神器:内置磁铁使指甲油金属颗粒偏移
2026-01-15 15:35
小米2026年国补全面开启:全品类覆盖 小米17系列到手价3999元起
2026-01-15 15:43
如何安全地重命名含空格与特殊字符的上传图片文件
2026-01-15 15:55
永远的蔚蓝星球红色武器强度介绍
2026-01-15 16:08
热门AI工具
DeepSeek
幻方量化公司旗下的开源大模型平台
AI大模型
开放平台
豆包大模型
字节跳动自主研发的一系列大型语言模型
通义千问
阿里巴巴推出的全能AI助手
腾讯元宝
腾讯混元平台推出的AI助手
文档处理
Excel 表格
文心一言
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
中文写作
讯飞写作
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
写作工具
即梦AI
一站式AI创作平台,免费AI图片和视频生成。
图片拼接
图画生成
ChatGPT
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
PDF 文档
相关专题
Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
832
2023.06.15
java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。
738
2023.07.05
Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。
734
2023.07.31
Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
397
2023.08.01
Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
398
2023.08.02
java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。
446
java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。
430
Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。
16926
2023.08.03
本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。
2
2026.01.16
热门下载
相关下载
精品课程
共23课时 | 2.5万人学习
共94课时 | 6.8万人学习
共578课时 | 46.4万人学习
共6课时 | 7万人学习
共79课时 | 151.2万人学习
共6课时 | 53.4万人学习
共4课时 | 0.9万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部