导航
电话
咨询
地图
顶部
在日常数据处理中,我们经常会遇到需要统计列表中特定类别元素出现频率的场景。例如,在一个包含家庭成员信息的列表中,我们可能需要统计不同类型的家庭成员(如兄弟姐妹、子女、配偶)各自有多少人。原始数据可能以 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推广 】
相关推荐: mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】 Windows10如何更改计算机工作组_Win10系统属性修改Workgroup Win11右键反应慢怎么办 Win11优化右键菜单加载速度【技巧】 如何在 Go 同包不同文件中正确引用结构体 Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理 Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】 如何在 Go 中判断变量是否为函数类型 PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】 Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】 c++ std::future和std::promise c++线程间通信【教程】 Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】 Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件 短链接怎么自定义还原php_修改解码规则适配需求【汇总】 Win11怎么关闭小组件_Win11禁用任务栏天气与小组件方法【设置】 如何使用Golang写入二进制文件_Golang io Write二进制写入示例 如何在 PHP 中按相同键合并两个关联数组为二维数组 Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】 Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】 Windows怎样关闭Edge新标签页广告_Windows关闭Edge新标签页设置【步骤】 LINUX如何删除用户和用户组_Linux userdel和groupdel命令用法【系统管理】 windows如何禁用驱动程序强制签名_windows高级启动设置指南 php下载安装选zip还是msi格式_两种安装包对比【教程】 c++中如何进行二进制文件读写_c++ read与write函数用法 如何在Golang中使用闭包_封装变量与函数作用域 如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】 Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】 如何在Golang中实现WebSocket广播_使用Channel和协程分发消息 PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】 如何在网页无标准表格标签时高效提取结构化数据 c# 在高并发场景下,委托和接口调用的性能对比 C#如何序列化对象为XML XmlSerializer用法 Win11怎么设置默认终端应用_Windows11开发者选项终端 VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】 Python脚本参数接收_sys与argparse解析【指导】 Windows 10怎么把任务栏放在屏幕上方_Windows 10解锁任务栏并拖动位置 Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】 C++如何解析JSON数据?(nlohmann/json库示例) php高频调试功能有哪些_php常用调试函数与工具汇总【解答】 Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】 Win11怎么开启游戏模式_Windows11优化游戏帧数设置指南 如何使用Golang实现Web表单数据绑定_自动映射字段到结构体 MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录 Win10怎么更改用户名 Win10修改账户名称操作教程 手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】 c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】 如何在 VS Code 中正确配置并使用 NumPy Win10电脑C盘红了怎么清理_Windows10系统盘深度瘦身指南 Win11笔记本怎么看电池健康度_Win11电池报告生成命令【详解】 Win11怎么卸载Origin游戏平台_Win11卸载Origin方法【教程】 c++如何利用doxygen生成开发文档_c++ 代码注释规范与HTML文档导出【案例】
赣ICP备2024031479号