导航
电话
咨询
地图
顶部
在日常的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(),它可以轻松实现基于某个属性的元素分组。
分组实现:
// 继续上面的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开发带来了革命性的改变。
# ai # 工具 # 处理器 # red # java # 键值对 # java开发
相关栏目: 【 行业资讯 】 【 网络运营 】 【 GEO优化 】 【 营销推广 】 【 SEO优化 】 【 技术教程 】 【 代码知识 】 【 AI推广 】
相关推荐: windows如何禁用驱动程序强制签名_windows高级启动设置指南 如何在JavaScript中动态拼接PHP的base_url与jQuery变量 如何在 VS Code 中正确配置并使用 NumPy 使用类变量定义字符串常量时的类型安全最佳实践 php增删改查报错1054怎么办_字段名错误排查修复【解答】 PHP主流架构怎么部署到Docker_容器化流程【操作】 LINUX怎么设置系统语言_LINUX修改中文环境 Win10怎么卸载金山毒霸_Win10彻底卸载金山毒霸方法【步骤】 TestNG的testng.xml配置文件怎么写 Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】 如何使用Golang指针与接口结合_实现方法调用和动态类型 Python网络异常模拟_测试说明【指导】 Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】 Windows如何设置登录时的欢迎屏幕背景?(锁屏界面) Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】 php怎么连接数据库_MySQL数据库连接的基础代码编写【说明】 Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能 Windows10系统更新错误0x80070002_Win10自动更新失败手动修复 Win11连不上WiFi怎么办 Win11无线网络图标消失解决办法 Win10如何更改任务栏高度_Windows10解锁任务栏调整大小 php增删改查在php8里有什么变化_新特性对curd的影响【指南】 Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】 Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用 Python函数接口稳定性_版本演进解析【指导】 Python变量绑定机制_引用模型解析【教程】 Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置 Win11开机速度慢怎么优化_Win11系统启动加速设置指南【方法】 Windows10怎么用“讲述人”读屏辅助 Windows10轻松使用开启讲述人朗读屏幕文字帮助视障用户【教程】 如何使用Golang log设置日志输出格式_Golang log日志格式示例 PythonPandas数据分析项目教程_时间序列透视表应用 Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】 php与c语言在嵌入式中有何区别_对比两者在硬件控制的优劣【详解】 PythonGIL机制理解_多线程限制解析【教程】 如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】 Win11怎么关闭通知消息_屏蔽Windows 11右下角弹窗通知设置【详解】 Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】 Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】 Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】 c++中explicit(bool)的用法 c++条件性explicit【C++20】 Win10系统映像怎么恢复 Win10使用系统映像还原电脑【指南】 LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现 Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】 Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】 Python日志系统设计与实现_高可观测性架构实战 Win10系统怎么查看显卡温度_Win10任务管理器GPU温度 如何使用正则表达式批量替换重复的“-”模式为固定字符串 php订单日志怎么记录物流_php记录订单物流变更日志指南【指南】 MAC如何快速搜索大文件_MAC磁盘空间分析与冗余数据清理【方法】 win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】 Go语言中slice追加操作的底层共享机制解析
赣ICP备2024031479号