基于来自另一个列表的值组合的流过滤器列表

时间:2019-06-29 11:22:33

标签: java java-8 java-stream

需要:要过滤列表中的数据-1基于列表中的值-2具有多个条件,即日期和订单号的组合

问题:能够根据1个条件进行过滤。但是,当我尝试添加另一个过滤条件时,会将其视为2个单独的&而不是组合。无法弄清楚如何将其组合起来。

希望的问题很明显。

研究:我提到了我先前针对类似需求的查询-Link1。还选中了-Link2

清单1 :(所有订单)

  • [日期|订单号|时间|公司简介评分]
  • [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 :(已完成的订单)

  • [日期|订单号|时间]
  • [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:

  • [日期|订单号|时间|公司简介费率]
  • [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 :(得分: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”