Java 8根据一个属性比较2个列表

时间:2018-09-19 10:29:45

标签: java filter java-8 java-stream list-comprehension

我有2个产品对象列表 而且,我想比较这两个列表,以确定同一产品的两个列表之间是否有任何 product_price_last_updated_time_stamp 不同。

我可以在Java 7中做到这一点,在每个循环中放置2个 但是我想实现的是Java 8(带有流和过滤器)

这是我在 Java 7

中的示例
List<Product> list1;
List<Product> list2;

for(Product p1 : list1) {
    for(Product p2 : list2) {
        if(!p1.getProduct_price_last_updated_time_stamp().equals(p2.getProduct_price_last_updated_time_stamp()) {
            System.out.print("This product price has been updated: "+p1.getProductName());
        }
    }
}

也有人可以帮助我了解Java 7和Java 8在性能方面的差异

1 个答案:

答案 0 :(得分:0)

尝试一下:-

    list1.stream()
            .flatMap(x -> list2
                    .stream()
                    .filter(y -> x.getId() == y.getId())
                    .filter(y -> !x.getLastUpdated().isEqual(y.getLastUpdated()))
                    .limit(1))
            .forEach(product -> System.out.println("Product price has been updated: " + product.getName()));

我假设您的priceLastUpdated属性是LocalDateTime类型。如果您使用的是其他类型,则可以调用相关的equals()方法而不是我上面使用的isEqual()

您提到了“同一产品的 ”,但是您的代码不会检查该产品是否相同。我使用id来检查它是否与产品x.getId() == y.getId()相同。您可以使用任何喜欢的字段。

关于性能,如果编码正确,Java 7和8之间没有实际区别。我之所以说“实用上的差异”,是因为要找出精确的差异(如果可能)涉及很多因素。

但是在代码示例中,即使找到匹配项,您也不会中断循环,这是非常低效的。