Java 8 Lambda – Intersection de deux listes

J’essaie de trouver l’ intersection de deux listes en fonction de certaines conditions et de certaines étapes. Impossible de trouver un moyen de le faire (en phase d’apprentissage) 🙂

 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.getLineEnsortinges()) { if (splitLineEntry.getOrderLineId().equals(orderLineEntry.getId()) && splitLineEntry.getStatusCode() != "PX") { totalAmount += orderLineEntry.getFinalAmount(); couponDiscount += orderLineEntry.getCouponDiscount() == null ? 0.00d : orderLineEntry.getCouponDiscount(); } } } 

Comme vous le voyez, la logique est simple

Obtenir tous les éléments de l’ordre en fonction d’une list filtres et recouper une autre list et faire des choses.

L’approche la plus simple est la suivante:

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

Je dois les comparer sur supposer list1.id == list2.fk_id

Commencez par créer un ensemble de fk_id;

 Set orderLineEntrSet = orderEntry.getOrderReleases().stream() .flatMap(orderReleaseEntry -> orderReleaseEntry.getOrderLines().stream()) .filter(orderLineEntry -> { Ssortingng 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.getLineEnsortinges().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(); }); 

Vous pouvez éviter d’utiliser une référence à un object tableau en utilisant la fonction réduire. par exemple, voyez comment Collectors.averagingDouble est implémenté. Mais je trouve cela plus compliqué.

Remarque: il s’agit de O (N) en utilisant un ensemble d’identifiants plutôt qu’en utilisant une liste d’ID correspondants qui serait O (N ^ 2)

List intersect = list1.stream (). Filter (set1 :: includes) .collect (Collectors.toList ());

Cela fonctionnera où T est Ssortingng, Integer, Float, etc., où est égal à, hashcode est assez simple. Mais si le T est un object personnalisé, nous devons implémenter HashCode & égal