需要:要过滤列表中的数据-1基于列表中的值-2具有多个条件,即日期和订单号的组合
问题:能够根据1个条件进行过滤。但是,当我尝试添加另一个过滤条件时,会将其视为2个单独的&而不是组合。无法弄清楚如何将其组合起来。
希望的问题很明显。
研究:我提到了我先前针对类似需求的查询-Link1。还选中了-Link2
清单1 :(所有订单)
清单2 :(已完成的订单)
过滤后的预期O / p:
代码:
// 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());
答案 0 :(得分:0)
您已要求执行此操作的逻辑:
日期和订单号的组合是唯一的。我需要检查List-2中是否存在唯一组合,如果是,则过滤掉,如果没有,则输出应包含该行。
Stream::filter()将返回流中的一个子集,其中过滤谓词返回true(即,过滤掉谓词为false的流中的那些对象)。
listOrders = listOrders.stream().filter(p -> !setDates.contains(p.getDate()) && !setOrderNumbers.contains(p.getOrderNumber()))
.collect(Collectors.toList());
您的代码表达式在此处显示“向我显示订单,其中订单的日期未出现在先前订单的列表中,并且订单的订单号未出现在先前订单的列表中”。您的逻辑表达是错误的(在电子学领域,您会感到困惑positive vs negative logic)。
您想要:
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”