流比较两个列表并同时修改一个

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

定制课程

@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() 的一部分,因此,我相信它一定不会导致任何数据/比较不一致。

java java-stream
1个回答
0
投票

要在过滤步骤中修改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());
                }
            });
© www.soinside.com 2019 - 2024. All rights reserved.