Java 8 сравнить 2 списка на основе одного свойства - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть 2 списка объектов Product И я хочу сравнить эти 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 голосов
/ 24 сентября 2018

Попробуйте: -

    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 нет практической разницы при правильном кодировании.Я говорю «практическая разница», потому что существует множество факторов, влияющих на определение точной разницы, если это вообще возможно.

В вашем примере кода вы не нарушаете цикл, даже если соответствиенайдено, что очень неэффективно.

...