Необходимость: Чтобы отфильтровать данные в списке - 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());