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 BillIdetList listDetail .@tsolakp merci de le faire!