我有两个列表,一个包含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());
}
它一直有效,直到我有两个(或更多)具有相同
ConsumedProductDto
的productID
。然后,当我想要两个(或更多)时,我只得到一个ProductDto
。任何想法出了什么问题?
另外,我知道我可以
@Override equals()
并使用contains()
检查那些共同的部分,但是像这样混合两个不同的类是个好主意吗? 最佳答案
从我对评论的答复中了解到,您实际上是在基于过滤条件的多个ProductDto
的输出中查找多个ConsumedProductDto
条目以匹配此类产品。
因此,您感兴趣的将是遍历consumedProductDto
并找到要在最终输出中收集的productDto
和map
的任何匹配项。这可能类似于以下方法:
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());
}