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

秋辰同学_7591

秋辰同学_7591

2025-12-27

815人浏览

原创

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

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

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

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

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

✅ 关键点说明:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 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。

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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java stream

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6959

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

670

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

533

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

303

6

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

80

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习