如何高效地为重复与唯一名称的产品设置不同的 frontName

发布时间 - 2025-12-27 00:00:00    点击率:

本文介绍一种高效、简洁的 java stream 方案,用于批量处理产品列表:对名称重复的产品拼接 category 名称生成 frontname,对唯一名称产品则直接赋值 name。

在实际业务中,我们常需根据字段的重复性对对象进行差异化处理。以 Product 类为例,当多个产品具有相同 name(但属于不同 categoryName)时,需将 frontName 设为 "name,categoryName";而名称唯一的商品,则仅设为 name。核心挑战在于:一次遍历识别重复项,再二次遍历完成赋值,避免嵌套循环导致 O(n²) 时间复杂度。

以下是一个兼顾可读性与性能的解决方案:

// 第一步:识别所有重复的 product name
Set seen = 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);
    }
});

关键点说明:

  • seen.add(name) 利用 HashSet.add() 的返回值(true 表示新增成功,false 表示已存在),精准捕获首次出现后的所有重复 name;
  • 使用 Set 存储重复名,保证后续 contains() 查询为 O(1);
  • 整体时间复杂度为 O(n),空间复杂度为 O(n)(最坏情况所有 name 均不同);
  • 无需修改原始类或引入第三方库,纯 JDK 8+ Stream 实现。

⚠️ 注意事项:

  • 此方案会原地修改 productList 中的对象,若需不可变处理,请先 stream().map(...).collect(...) 构建新列表;
  • 若 name 可能为 null,建议提前过滤或使用 Objects.toString(p.getName(), "") 避免 NPE;
  • 如需区分“严格重复”(至少出现两次)而非“第二次及以后”,当前逻辑已满足——duplicateNames 中只含真正重复的 name。

该方法简洁、高效、易于维护,是处理此类“分组差异化赋值”场景的推荐实践。


# java  # go  # ai  # stream 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何快速配置高效服务器建站软件?  微信小程序 闭包写法详细介绍  利用vue写todolist单页应用  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  在线制作视频的网站有哪些,电脑如何制作视频短片?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  教你用AI润色文章,让你的文字表达更专业  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  C#如何调用原生C++ COM对象详解  如何用免费手机建站系统零基础打造专业网站?  MySQL查询结果复制到新表的方法(更新、插入)  Laravel怎么使用artisan命令缓存配置和视图  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何批量查询域名的建站时间记录?  如何选择可靠的免备案建站服务器?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何在IIS管理器中快速创建并配置网站?  如何确保西部建站助手FTP传输的安全性?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Android GridView 滑动条设置一直显示状态(推荐)  如何在建站主机中优化服务器配置?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何用PHP工具快速搭建高效网站?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  iOS UIView常见属性方法小结  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在云主机快速搭建网站站点?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何在阿里云域名上完成建站全流程?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在Tomcat中配置并部署网站项目?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  网站制作免费,什么网站能看正片电影?  微信小程序 配置文件详细介绍  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何在云服务器上快速搭建个人网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何在阿里云部署织梦网站?  怎么用AI帮你为初创公司进行市场定位分析?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何在IIS7上新建站点并设置安全权限?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解