定制课程
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private String name;
private String systemId;
private String productId;
private String productPartId;
private boolean isMandatory;
private String status;
public Product(String name, String systemId, String productId, String productPartId) {
this.name = name;
this.systemId = systemId;
this.productId = productId;
this.productPartId = productPartId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Product product = (Product) o;
return Objects.equals(systemId, product.systemId) && Objects.equals(productId, product.productId)
&& Objects.equals(productPartId, product.productPartId);
}
@Override
public int hashCode() {
return Objects.hash(systemId, productId, productPartId);
}
}
包含上述自定义对象的两个列表:
List<Product>bankConceptProducts = //has isMandatory and status set but NOT name.
List<Product>customerProducts = //has name set but NOT isMandatory, status.
以上两个列表都正确设置了 equals() 和 hashCode() 中使用的字段。
现在,我正在尝试创建一个“交叉点”列表,它正在按预期工作:
customerProducts.stream().filter(bankConceptProducts::contains).toList()
但我希望通过在过滤步骤中设置名称来修改bankConceptProducts(所以不是源列表)列表(以避免只是为了设置名称而重复)。是否有可能或者我必须使用map(这意味着又一次迭代)或者toList()之后的东西?
请注意,name 不是 equals() 和 hashCode() 的一部分,因此,我相信它一定不会导致任何数据/比较不一致。
要在过滤步骤中修改bankConceptProducts列表而不引起重复,可以使用forEach方法而不是toList。这允许您在流式传输 customerProducts 时修改bankConceptProducts 列表的元素。
此代码迭代 customerProducts,根据它们是否包含在bankConceptProducts 中过滤它们,然后迭代bankConceptProducts 中的每个匹配产品。如果找到相应的产品,则会设置 customerProduct 中的名称。
customerProducts.stream()
.filter(bankConceptProducts::contains)
.forEach(customerProduct -> {
// Find the corresponding product in bankConceptProducts
Product bankProduct = bankConceptProducts.stream()
.filter(product -> product.equals(customerProduct))
.findFirst()
.orElse(null);
// Set the name if the corresponding product exists in bankConceptProducts
if (bankProduct != null) {
bankProduct.setName(customerProduct.getName());
}
});