扫码关注官方订阅号
正文
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---");
代码解析:
输出示例:
一款AI写作润色工具,QuillBot的人工智能改写工具将提高你的写作能力。
按账户分组后的数据: --- 账户组 --- {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开发带来了革命性的改变。
相关文章
JSON 无法正确反序列化为 Java POJO 对象的常见原因及解决方案
如何在函数中动态创建并管理多个类实例以实现跨调用数据比较
如何在 macOS 上正确运行 Java TCP 服务器/客户端通信程序
Java中调用自定义栈底插入方法的正确方式
JSON 数据无法正确反序列化为 Java POJO 对象
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
如何在函数中创建并管理多个类实例以进行跨调用比较
2026-01-29 16:41
内存价格暴涨!iPhone 18系列起售价竟没变
2026-01-29 16:42
promovie如何拍照片
2026-01-29 16:51
黄仁勋访华取得成果 数十万颗英伟达H200芯片订单获批:我国回应
2026-01-29 16:59
Go 中接口实现与方法接收者类型匹配的原理详解
2026-01-29 17:02
动态生成多页面并实现 URL 路由跳转的 JavaScript 教程
2026-01-29 17:21
如何重置或继承 HTML 元素的 CSS 属性值(而非使用 initial)
2026-01-29 17:26
CDPR创意总监发布《往日之影》截图 暗示续作过场仍为第一人称
2026-01-29 17:33
《GTA6》狂热粉为窥探新作 用无人机偷拍R星办公室
2026-01-29 17:34
微信callkit怎么设置
2026-01-29 17:44
热门AI工具
幻方量化公司旗下的开源大模型平台
字节跳动自主研发的一系列大型语言模型
阿里巴巴推出的全能AI助手
腾讯混元平台推出的AI助手
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
一站式AI创作平台,免费AI图片和视频生成。
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
相关专题
在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
463
2023.08.02
c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。
236
2023.09.22
在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。
458
2024.03.01
在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。
539
2023.12.01
本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。
21
2025.12.22
本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。
28
2026.01.06
本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。
75
2025.09.05
本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。
36
2025.11.16
本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。
1
2026.01.29
热门下载
相关下载
精品课程
共23课时 | 3万人学习
共94课时 | 7.9万人学习
共578课时 | 53.2万人学习
共6课时 | 11.2万人学习
共79课时 | 151.7万人学习
共6课时 | 53.4万人学习
共4课时 | 22.4万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部