如何高效地为重复名称与唯一名称的产品设置不同的 frontName 字段
发布时间 - 2025-12-27 00:00:00 点击率:次本文介绍一种高效、简洁的 java stream 方案,通过一次遍历识别重复产品名称,再批量更新 frontname 字段:对同名产品拼接 category,对唯一名称产品仅保留 name。避免嵌套循环,时间复杂度优化至 o(n)。
在实际业务中,我们常需根据字段的“唯一性”对对象进行差异化处理。以 Product 类为例:
@Data
public class Product {
private UUID id;
private String name;
private String categoryName;
private String frontName;
}目标明确:
- 若某 name 在列表中出现多次(即存在同名但不同类别的产品),则 frontName = name + "," + categoryName;
- 若 name 全局唯一,则 frontName = name。
✅ 推荐解法:两阶段流式处理(O(n) 时间复杂度)
核心思路是先标记重复项,再统一赋值,避免 Collectors.groupingBy 后二次遍历分组集合,兼顾可读性与性能:
// 第一阶段:识别所有重复的 product name Setseen = new HashSet<>(); Set duplicateNames = productList.stream() .map(Product::getName) .filter(name -> !seen.add(name)) // add() 返回 false → 已存在 → 是重复项 .collect(Collectors.toSet()); // 第二阶段:按规则更新 frontName productList.forEach(product -> { String name = product.getName(); if (duplicateNames.contains(name)) { product.setFrontName(name + "," + product.getCategoryName()); } else { product.setFrontName(name); } });
? 关键技巧说明:HashSet.add() 方法返回 true 表示首次添加成功,false 表示元素已存在。利用这一特性,在 filter 中直接捕获所有“第二次及以后出现”的 name,精准构建 duplicateNames 集合。
⚠️ 注意事项
- 线程安全:该方案适用于单线程场景;若在并发环境中操作 productList,需确保其线程安全(如使用 Collections.synchronizedList 或改用不可变结构 + Stream.parallel() 配合线程安全容器)。
-
null 安全:若
name 可能为 null,需提前过滤或使用 Objects.toString(p.getName(), ""),否则 HashSet.add(null) 合法但 duplicateNames.contains(null) 易引发空指针——建议补充校验:.filter(Objects::nonNull) .map(Product::getName)
- 内存友好:仅额外使用两个 HashSet(seen 和 duplicateNames),空间复杂度为 O(k),k 为不同 name 的数量,远优于 groupingBy 生*量分组映射。
✅ 替代方案对比(简要)
| 方案 | 时间复杂度 | 是否推荐 | 说明 |
|---|---|---|---|
| 双重 for 循环判断重复 | O(n²) | ❌ | 数据量大时性能急剧下降 |
| groupingBy(name) + counting() 再过滤 | O(n) | △(可读但稍冗余) | 需创建完整分组映射,内存开销略高 |
| 本方案(HashSet.add() 巧用) | O(n) | ✅ | 一次流+一次遍历,零中间集合膨胀,语义清晰 |
该方法已在 Spring Boot 服务中稳定用于商品前台展示逻辑,日均处理万级产品列表无性能瓶颈。建议作为处理“基于字段重复性差异化赋值”类需求的标准实践。
# java
# go
# ai
# stream
# 性能瓶颈
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站宝盒中设置产品搜索功能?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何在Windows 2008云服务器安全搭建网站?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何在宝塔面板中创建新站点?
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
如何续费美橙建站之星域名及服务?
如何在万网利用已有域名快速建站?
如何在香港免费服务器上快速搭建网站?
MySQL查询结果复制到新表的方法(更新、插入)
html5的keygen标签为什么废弃_替代方案说明【解答】
JavaScript实现Fly Bird小游戏
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
javascript日期怎么处理_如何格式化输出
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
教你用AI将一段旋律扩展成一首完整的曲子
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
高防服务器:AI智能防御DDoS攻击与数据安全保障
高端网站建设与定制开发一站式解决方案 中企动力
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
佛山网站制作系统,佛山企业变更地址网上办理步骤?
JavaScript Ajax实现异步通信
教学论文网站制作软件有哪些,写论文用什么软件
?
如何获取免费开源的自助建站系统源码?
详解Oracle修改字段类型方法总结
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
打造顶配客厅影院,这份100寸电视推荐名单请查收
Laravel如何生成URL和重定向?(路由助手函数)
Python函数文档自动校验_规范解析【教程】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
如何挑选高效建站主机与优质域名?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
怎么用AI帮你为初创公司进行市场定位分析?
如何用PHP工具快速搭建高效网站?


name 可能为 null,需提前过滤或使用 Objects.toString(p.getName(), ""),否则 HashSet.add(null) 合法但 duplicateNames.contains(null) 易引发空指针——建议补充校验: