导航
电话
咨询
地图
顶部
在日常数据处理中,我们经常会遇到需要统计列表中特定类别元素出现频率的场景。例如,在一个包含家庭成员信息的列表中,我们可能需要统计不同类型的家庭成员(如兄弟姐妹、子女、配偶)各自有多少人。原始数据可能以 list> 的形式存在,其中每个 map 代表一个成员的详细信息,例如:
| Add_Family_Member | Full_Name | Date_Of_Birth | Gender | | Sibling | Sibling name | 12-12-1990 | Male | | Sibling | Sibling name2 | 12-12-1990 | Male | | Sibling | Sibling name2 | 12-12-1990 | Male | | Child | Child name | 12-12-2010 | Male | | Child | Child name2 | 12-12-2000 | Female | | Spouse | Spouse name | 12-12-1990 | Male |
我们的目标是高效地统计出 "Sibling" 有 3 个,"Child" 有 2 个,"Spouse" 有 1 个。
虽然 List> 可以存储这类数据,但它在处理时存在一些局限性,例如缺乏类型安全,在访问数据时需要通过字符串键来获取,容易出错且代码可读性差。对于结构化的数据,更推荐的做法是定义一个POJO(Plain Old Java Object)类来封装数据。这不仅提供了编译时类型检查,还能使代码更清晰、更易于维护。
以下是 FamilyMember POJO 类的定义:
import java.time.LocalDate; // Java 8日期API public class FamilyMember { private String memberType; private String fullName; private LocalDate dateOfBirth; private String gender; public FamilyMember(String memberType, String fullName, LocalDate dateOfBirth, String gender) { this.memberType = memberType; this.fullName = fullName; this.dateOfBirth = dateOfBirth; this.gender = gender; } // Getters public String getMemberType() { return memberType; } public String getFullName() { return fullName; } public LocalDate getDateOfBirth() { return dateOfBirth; } public String getGender() { return gender; } // Setters (可选,根据业务需求添加) public void setMemberType(String memberType) { this.memberType = memberType; } public void setFullName(String fullName) { this.fullName = fullName; } public void setDateOfBirth(LocalDate dateOfBirth) { this.dateOfBirth = dateOfBirth; } public void setGender(String gender) { this.gender = gender; } }
Java 8 引入的 Stream API 提供了强大且富有表现力的数据处理能力。结合 Collectors.groupingBy() 和 Collectors.counting(),我们可以非常简洁地实现按类型计数的需求。
下面是具体的实现代码,展示了如何使用 FamilyMember POJO 和 Stream API 进行统计:
import java.time.LocalDate; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class FamilyMemberCounter { public static void main(String[] args) { // 1. 创建FamilyMember对象列表作为示例数据 List listOfFamilyMember = Arrays.asList( new FamilyMember("Sibling", "Sibling name", LocalDate.of(1990, 12, 12), "Male"), new FamilyMember("Sibling", "Sibling name2", LocalDate.of(1990, 12, 12), "Male"), new FamilyMember("Sibling", "Sibling name3", LocalDate.of(1990, 12, 12), "Male"), new FamilyMember("Child", "Child name", LocalDate.of(2010, 12, 12), "Male"), new FamilyMember("Child", "Child name2", LocalDate.of(2000, 12, 12), "Female"), new FamilyMember("Spouse", "Spouse name", LocalDate.of(1990, 12, 12), "Male") ); // 2. 使用Stream API进行分组和计数 // 将列表转换为流,然后使用Collectors.groupingBy按memberType分组,并用Collectors.counting统计每个组的数量 Map countMembers = listOfFamilyMember.stream() .collect(Collectors.groupingBy(FamilyMember::getMemberType, // 分组依据:FamilyMember的memberType属性 Collectors.counting())); // 对每个分组内的元素进行计数 // 3. 打印结果 System.out.println(countMembers); } }
代码解析:
输出结果:
{Spouse=1, Sibling=3, Child=2}
这个输出清晰地展示了每种家庭成员类型的数量,与我们的预期完全一致。
// 假设 inputList 是 List> Map countMapFromRaw = inputList.stream() .collect(Collectors.groupingBy(map -> map.get("Add_Family_Member"), Collectors.counting()));
但这种方式不如使用POJO类型安全和优雅,因为字符串键容易拼写错误且编译时无法检查。
本文详细阐述了如何利用Java 8 Stream API中的 Collectors.groupingBy() 和 Collectors.counting() 功能,高效地统计集合中特定类型元素的出现次数。通过将原始的 List> 结构优化为POJO类,我们不仅提升了代码的健壮性和可读性,还展示了流式操作在数据聚合方面的强大能力。掌握这些技术,可以显著提高Java应用程序中数据处理的效率和代码质量。
# ai # 重构 # 封装 # 这是 # 处理器 # red # function # 多核 # 家庭成员 # 对象 # Java # String # 泛型 # 字符串 # 数据结构 # map # Object # 代码可读性 # 流式 # 转换为 # ide # 数据处理 # 组中 # 展示了 # 收集器 # java应用程序
相关栏目: 【 行业资讯 】 【 网络运营 】 【 GEO优化 】 【 营销推广 】 【 SEO优化 】 【 技术教程 】 【 代码知识 】 【 AI推广 】
相关推荐: Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新 Windows驱动签名被阻止原因_禁用签名强制检测的安全处理 Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】 Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理 Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】 php增删改查报错1054怎么办_字段名错误排查修复【解答】 Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】 php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】 Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁 Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】 Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】 PHP 中如何在函数内持久修改引用变量所指向的目标 php修改数据怎么批量改状态_批量更新status字段值技巧【操作】 php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】 如何使用Golang实现函数指针_函数变量与回调示例 MAC怎么一键隐藏桌面所有图标_MAC极简模式切换与终端指令【方法】 Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】 Linux怎么禁止Root用户远程登录_Linux系统SSH加固与安全设置【教程】 Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式 如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟 Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数 Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】 如何高效识别并拦截拼接式恶意域名 spam Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值 Win11怎么关闭通知消息_屏蔽Windows 11右下角弹窗通知设置【详解】 如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法 Python性能剖析高级教程_cProfileLineProfiler优化案例解析 Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】 Win11更新后变慢怎么办_Win11系统更新后卡顿优化方案【详解】 Win10怎么卸载金山毒霸_Win10彻底卸载金山毒霸方法【步骤】 c# Task.ConfigureAwait(true) 在什么场景下是必须的 php怎么下载安装后设置默认字符集_utf8配置步骤【详解】 Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】 Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】 Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】 Python函数接口文档化_自动化说明【指导】 Win11怎么关闭自动修复_跳过Win11开机自动修复循环【技巧】 Win10系统怎么查看显卡温度_Win10任务管理器GPU温度 如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例 Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答) 如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法 php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】 微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】 如何使用Golang template生成文本模板_动态生成HTML或文本 Python函数接口稳定性_版本演进解析【指导】 Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小 Python文件管理规范_工程实践说明【指导】 Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递 Win11怎么关闭系统提示音_Windows11声音方案设为无声教程 Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
赣ICP备2024031479号