我有以下产品类别:
@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())
我尝试了各种流选项,但最终找不到解决方案。
这项任务的更有效解决方案是什么?
请看以下代码:
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());
}
});
您可以通过多种方式找到解决方案。
我的第一个想法是,例如,假设您有一个包含所有产品的列表< Product>,那么您需要:
遍历所有产品并按名称将每个产品保存在地图中
迭代此映射的所有条目并检查列表的大小是否大于1,这意味着该产品与其他产品有重复(或更多)名称。否则它是独一无二的。