如何高效为同名与唯一名称的Product对象设置frontName字段?
高效实现方案
核心思路是先统计每个产品名称的出现次数,再根据次数批量设置frontName,整体时间复杂度为O(n),是高效的实现方式:
1. 统计名称出现次数
通过Stream分组收集器快速统计每个产品名称的重复次数:
Map<String, Long> nameCountMap = productList.stream() .collect(Collectors.groupingBy(Product::getName, Collectors.counting()));
2. 批量设置frontName
遍历产品列表,根据统计结果判断是否需要拼接分类名称:
productList.forEach(product -> { long nameOccurrence = nameCountMap.get(product.getName()); if (nameOccurrence > 1) { product.setFrontName(product.getName() + "," + product.getCategoryName()); } else { product.setFrontName(product.getName()); } });
方案优势
- 仅需两次线性遍历,避免嵌套循环带来的O(n²)复杂度;
- 统计逻辑和设置逻辑分离,代码简洁易维护;
- 若数据量极大,可将
stream()替换为parallelStream()实现并行处理(需确保Product对象无并发修改风险)。
内容的提问来源于stack exchange,提问作者Alex Grimaldo
相关产品推荐
相关产品推荐

