Java 8 Lambda – 两个列表的交集

我试图根据某些条件找到两个列表的intersection并执行一些步骤。 找不到办法(在学习阶段):)

 Double totalAmount = 0.00d; Double discount = 0.00d; List orderLineEntryList = orderEntry.getOrderReleases().stream() .flatMap(orderReleaseEntry -> orderReleaseEntry.getOrderLines().stream()) .filter(orderLineEntry -> orderLineEntry.getStatus().equals("PP") || orderLineEntry.getStatus().equals("PD")) .collect(Collectors.toList()); for (OrderLineEntry orderLineEntry : orderLineEntryList) { for (SplitLineEntry splitLineEntry : splitReleaseEntry.getLineEntries()) { if (splitLineEntry.getOrderLineId().equals(orderLineEntry.getId()) && splitLineEntry.getStatusCode() != "PX") { totalAmount += orderLineEntry.getFinalAmount(); couponDiscount += orderLineEntry.getCouponDiscount() == null ? 0.00d : orderLineEntry.getCouponDiscount(); } } } 

如您所见,逻辑很简单

根据某些filterlist从订单中获取所有项目并与其他list相交并执行一些操作。

最简单的方法是:

 List intersect = list1.stream() .filter(list2::contains) .collect(Collectors.toList()); 

我需要在假设list1.id == list2.fk_id上比较它们

首先建立一组fk_id;

 Set orderLineEntrSet = orderEntry.getOrderReleases().stream() .flatMap(orderReleaseEntry -> orderReleaseEntry.getOrderLines().stream()) .filter(orderLineEntry -> { String s = orderLineEntry.getStatus(); return "PP".equals(s) || "PD".equals(s); }) .map(e -> e.getId()) .collect(Collectors.toSet()); double[] totalAmount = { 0.0 }; double[] couponDiscount = { 0.0 }; orderLineEntryList.stream() .flatMap(sre -> sre.getLineEntries().stream()) .filter(ole -> orderLineEntrySet.contains(ole.getOrderLineId()) .filter(ole -> !"PX".equals(ole.getStatusCode())) .forEach(ole -> { totalAmount[0] += ole.getFinalAmount(); if (ole.getCouponDiscount() != null) couponDiscount[0] += ole.getCouponDiscount(); }); 

您可以使用reduce函数避免使用对数组对象的引用。 例如,看看如何实现Collectors.averagingDouble。 但我发现这更复杂。

注意:这是O(N),使用一组id而不是使用匹配的id列表,它们是O(N ^ 2)

List intersect = list1.stream()。filter(set1 :: contains).collect(Collectors.toList());

这将适用于T是String,Integer,Float等等于,hashcode相当简单的地方。 但是如果T是一个自定义对象,我们需要实现HashCode和equals