更改唯一和非唯一对象的字段值[已关闭]

问题描述 投票:0回答:2

我有以下产品类别:

@Data
public class Product {
    private UUID id;
    private String name;
    private String categoryName;
    private String frontName;
}

我有一个产品列表 - 有些产品名称相同,即使它们有不同的类别。我需要对具有相同名称的产品执行以下操作:

product.setFrontName(product.getName() + "," + product.getCategoryName())

对于具有独特名称的产品,只需要做:

product.setFrontName(product.getName())

我尝试了各种流选项,但最终找不到解决方案。

这项任务的更有效解决方案是什么?

java collections java-stream
2个回答
2
投票

请看以下代码:

Set<String> items = new HashSet<>()
Set<String> duplicateProduct = 
    productList
            .stream()
            .filter(p -> !items.add(p.name))
            .map(Product::getName) // Set.add() returns false if the element was already in the set.
            .collect(Collectors.toSet());

    productList.forEach( p ->{
       if(duplicateProduct.contains(p.getName())){
           p.setFrontName(p.getName() + "," + p.getCategoryName());
       } else {
           p.setFrontName(p.getName());
       }
    });

0
投票

您可以通过多种方式找到解决方案。

我的第一个想法是,例如,假设您有一个包含所有产品的列表< Product>,那么您需要:

  1. 遍历所有产品并按名称将每个产品保存在地图中>。相同名称的产品应存储在以名称为键的 List< Product> 值中。

  2. 迭代此映射的所有条目并检查列表的大小是否大于1,这意味着该产品与其他产品有重复(或更多)名称。否则它是独一无二的。

© www.soinside.com 2019 - 2024. All rights reserved.