java - 包含不同对象的 2 个列表的公共部分
问题描述
我有两个列表,一个包含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()
,但是像这样混合 2 个不同的类是个好主意吗?
解决方案
正如我从对评论的回复中了解到的那样,您实际上是在根据过滤条件ProductDto
在输出中为多个 s 查找多个条目以匹配此类产品。ConsumedProductDto
因此,您会感兴趣的是遍历consumedProductDto
s 并找到 s 的任何匹配项,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());
}
推荐阅读
- node.js - 无法通过带有 uglify-js 相关漏洞的 npm 审计
- java - 重命名 TableRow 属性名称
- r - 将单独文件中的 Stata 值标签读入 R
- java - Java 连接到 mySQL
- javascript - 当请求的凭据模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”
- r - R 函数不会按预期抛出错误
- f# - 这些从未更改(或仅在开始时更改一次)设置的模块属性?
- jquery - 打字稿模型到json - 忽略空值属性
- excel - 在 VBA 中使用字符串变量设置变量名
- c - 为什么我的检查 BST 树是否 AVL 错误的代码?