【发布时间】:2019-08-24 21:15:14
【问题描述】:
我有两个列表,一个包含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() 检查那些共同部分,但是像这样混合两个不同的类是个好主意吗?
【问题讨论】:
-
它可以工作,直到我有两个(或更多)ConsumedProductDto 具有相同的产品ID。然后,当我想要两个(或更多)时,我只得到一个 ProductDto ...你的意思是如果有 1 个
ProductDto和id:xyz和 2 个ConsumedProductDto和 @987654334 @ 那么你会在输出结果中有ProductDto2 次吗?还是别的什么? -
是的,这正是我的意思。
标签: java list java-stream