我有两个列表,一个包含ProductDto,另一个包含ConsumedProductDto

@Builder
@Getter
@ToString
public class ProductDto {
    private final String id;
    private final String productName;
    private final Double calories;
    private final Double protein;
    private final Double fat;
    private final Double carbohydrates;
    private final Double weight;
}

@Getter
@Builder
@ToString
public class ConsumedProductDto {
    private final String username;
    private final LocalDate date;
    private final String productID;
    private final Double weight;
}


现在,我想获得这两个列表的共同部分,如果ProductDto.id == ConsumedProductDto.productID

我写了那个函数来做到这一点:

private List<ProductDto> matchingProducts(List<ProductDto> products, List<ConsumedProductDto> consumedProducts) {
        return products.stream().filter(product ->
                consumedProducts.stream()
                        .allMatch(consumedProduct ->
                              product.getId().equals(consumedProduct.getProductID())))
                .collect(Collectors.toList());
    }


它一直有效,直到我有两个(或更多)具有相同ConsumedProductDtoproductID。然后,当我想要两个(或更多)时,我只得到一个ProductDto

任何想法出了什么问题?
另外,我知道我可以@Override equals()并使用contains()检查那些共同的部分,但是像这样混合两个不同的类是个好主意吗?

最佳答案

从我对评论的答复中了解到,您实际上是在基于过滤条件的多个ProductDto的输出中查找多个ConsumedProductDto条目以匹配此类产品。

因此,您感兴趣的将是遍历consumedProductDto并找到要在最终输出中收集的productDtomap的任何匹配项。这可能类似于以下方法:

private List<ProductDto> matchingProducts(List<ProductDto> products, List<ConsumedProductDto> consumedProducts) {
    return consumedProducts.stream()
            .map(consumedProductDto -> products.stream()
                    .filter(productDto -> productDto.getId().equals(consumedProductDto.getProductID()))
                    .findAny().orElse(null))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}

09-27 11:26