需要:基于列表中的数据 - 1中的数据 - 2中的值 - 2带有多个标准,即date& amp;订单号
问题:能够根据1个标准过滤。但是,当我尝试添加另一个过滤条件时,它将其视为2个单独的&不是组合。无法弄清楚如何将其作为组合。
希望面对的问题很明确。
研究:我在类似需求-Link1的早期查询中转介了我的查询。还检查了-Link2
列表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:
- [日期|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());
您已经要求逻辑做到这一点:
日期的组合订单号是唯一的。我需要检查List-2中是否存在该唯一组合,如果是,则过滤,如果不是,则输出应包含该行。
stream :: filter((将返回流的子集,其中过滤器谓词返回true(即,它在流中滤除了谓词为false的流中的这些对象(。
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());
"向我展示订单的日期和订单ID的订单 出现在先前的订单列表中"
或:
listOrders = listOrders.stream().filter(p -> !setDates.contains(p.getDate()) || !setOrderNumbers.contains(p.getOrderNumber()))
.collect(Collectors.toList());
"向我展示订单以前从未见过的订单 或订单的ID在"
之前都没有看到