基于另一个列表中值组合的流滤波器列表



需要:基于列表中的数据 - 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在"

之前都没有看到

最新更新