【问题标题】:Common part of 2 lists that contains different objects包含不同对象的 2 个列表的公共部分
【发布时间】: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 @ 那么你会在输出结果中有ProductDto 2 次吗?还是别的什么?
  • 是的,这正是我的意思。

标签: java list java-stream


【解决方案1】:

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

因此,您会感兴趣的是遍历 consumedProductDtos 并找到要在最终输出中收集的 productDtos 和 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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多