newListBill.add(new Bill(1L)); newListBill.add(new Bill(3L)); newListBill.add(new Bill(5L));
5 Réponses :
Utilisation de l'API de flux:
listBill.stream() .filter( b -> !listDetail.stream() .anyMatch( d -> d.getBillId().getCode() == b.getCode() ) ) .collect( Collectors.toList() );
Désolé. J'ai utilisé votre ancien exemple de code. Voir la réponse mise à jour.
vous pouvez utiliser noneMatch
au lieu de ! anyMatch
Vous pouvez simplement parcourir les deux listes et comparer la variable de code (si je comprends bien, c'est le seul critère que vous souhaitez comparer?):
ArrayList<Bill> result = new ArrayList<>(); for(Bill bill: listBill) { for(Detail detail : listDetail) { if(bill.getCode() == detail.getBillId().getCode() { result.add(bill); } } }
la condition est, si non trouvée!
Utilisation de Stream, Java 8
List<Bill> substractListBill = listBill.stream().filter(bill -> !listDetail.stream() .map(Detail::getBillId) .map(BillId::getCode) .anyMatch(code -> Objects.equals(code, bill.getCode()))) .collect(Collectors.toList()); System.out.println(substractListBill);
Il existe une solution plus optimale avec une complexité O (nlogn). Premièrement, obtenez la liste des codes à partir des détails:
List<Bill> collect = listBill.stream() .filter(bill -> Collections.binarySearch(codes, bill.getCode()) < 0) .collect(Collectors.toList()); System.out.println(collect); // [Bill{code=1}, Bill{code=3}, Bill{code=5}]
Et maintenant, faites le filtre avec la recherche binaire (les codes
ont déjà été triés):
List<Long> codes = listDetail.stream() .map(detail -> detail.getBillId().getCode()) .sorted() .collect(Collectors.toList());
Juste une autre variante de la réponse existante avec l'utilisation de noneMatch
pour éviter la négation explicite:
List<Bill> output = listBill.stream() .filter( b -> listDetail.stream() .noneMatch(d -> d.getBillId().getCode().equals(b.getCode()))) // change here .collect(toList());
Pardon qu'en est-il de stackoverflow.com/questions/61844376
Veuillez corriger
void BillId
etList listDetail
.@tsolakp merci de le faire!