Список фильтров потока на основе комбинации значений из другого списка - PullRequest
0 голосов
/ 29 июня 2019

Необходимость: Чтобы отфильтровать данные в списке - 1 на основе значений в списке - 2 с несколькими критериями, т. Е. Комбинация даты и номера заказа

Проблема: Возможность фильтрации по 1 критерию.Но когда я пытаюсь добавить другое условие фильтра, он обрабатывает его как 2 отдельных, а не как комбинациюНевозможно понять, как сделать это как комбинацию.

Надеюсь, что возникла проблема, ясна.

Исследование: Я ссылался на свой предыдущий запрос о подобной необходимости - Ссылка1 .Также проверено - Ссылка2

Список 1: (Все заказы)

  • [Дата |OrderNumber |Время |Компания |Оценить]
  • [2014-10-01 |12345 |10:00:01 |CompA |1000]
  • [2015-03-01 |23456 |08:00:01 |CompA |2200]
  • [2016-08-01 |34567 |09:00:01 |CompA |3300]
  • [2017-09-01 |12345 |11:00:01 |CompA |4400]
  • [2017-09-01 |98765 |12:00:01 |CompA |7400]

Список 2: (выполненные заказы)

  • [Дата |OrderNumber |Время]
  • [2014-10-01 |12345 |10:00:01]
  • [2015-03-01 |23456 |08:00:01]
  • [2016-08-01 |34567 |09:00:01]
  • [2017-09-01 |98765 |12:00:01]

Ожидаемое значение O / p после фильтра:

  • [Date |OrderNumber |Время |Компания |Оценить]
  • [2017-09-01 |12345 |11:00:01 |CompA |4400]

Код:

// Data extracted from MySQL database
// List 1: All Orders
List<ModelAllOrders> listOrders = getDataFromDatabase.getTable1();
// List 2: Completed Orders
List<ModelCompletedOrders> listCompletedOrders = getDataFromDatabase.getTable2();

// Filter with 1 criteria works
Set<Integer> setOrderNumbers = listCompletedOrders.stream().map(ModelCompletedOrders::getOrderNumber).collect(Collectors.toSet());

listOrders = listOrders.stream().filter(p -> !setOrderNumbers.contains(p.getOrderNumber()).collect(Collectors.toList());

// Below not working as expected when trying to combinational filter
Set<LocalDate> setDates = listCompletedOrders.stream().map(ModelCompletedOrders::getDate).collect(Collectors.toSet());

listOrders = listOrders.stream().filter(p -> !setDates.contains(p.getDate()) && !setOrderNumbers.contains(p.getOrderNumber()))
        .collect(Collectors.toList());

1 Ответ

0 голосов
/ 29 июня 2019

Вы запросили логику, которая сделает это:

Комбинация даты и номера заказа уникальна.Мне нужно проверить, присутствует ли эта уникальная комбинация в Списке-2, если да, то отфильтровать, если нет, то выходные данные должны содержать эту строку.

Stream :: filter () вернет подмножество потока, в котором предикат фильтра возвращает истину (т.е. он отфильтровывает те объекты в потоке, где предикат ложен).

listOrders = listOrders.stream().filter(p -> !setDates.contains(p.getDate()) && !setOrderNumbers.contains(p.getOrderNumber()))
    .collect(Collectors.toList());

Ваше кодовое выражение здесь говорит: «покажи мне порядки, гдедата заказа не отображается в списке предыдущих заказов И если номер заказа не отображается в списке предыдущих заказов ".Ваше логическое выражение неверно (вы путаетесь между тем, что в электронике называется положительный против отрицательной логики ).

Вы хотите либо:

listOrders = listOrders.stream().filter(p -> !(setDates.contains(p.getDate()) && setOrderNumbers.contains(p.getOrderNumber())))
    .collect(Collectors.toList());

"показать мне заказы, в которых нет даты и идентификатора заказа в списке предыдущих заказов"

или:

listOrders = listOrders.stream().filter(p -> !setDates.contains(p.getDate()) || !setOrderNumbers.contains(p.getOrderNumber()))
    .collect(Collectors.toList());

"показать мнезаказы, в которых либо дата заказа не была видна раньше, либо идентификатор заказа не был виден раньше "

...