1
votes

Débarrassez-vous des doublons sur une ligne au lieu de deux avec java 8 stream

Pourrait-il être écrit sur une ligne de code au lieu de deux? Parce que j'ai essayé d'ajouter .distinct () dans la première ligne et d'une manière ou d'une autre cela n'a pas fonctionné. Je ne comprends pas la différence ici.

List<BgwContract> contractListWithDuplicates = monthlyFeePaymentList
           .stream()
           .map(MonthlyFeePayment::getBgwContract)
           .collect(Collectors.toList());

List<BgwContract> contractListWithoutDuplicates = contractListWithDuplicates
           .stream()
           .distinct()
           .collect(Collectors.toList());


2 commentaires

Oh ok, je l'ai mis avant .map () . Pouvez-vous expliquer pourquoi cela n'a pas fonctionné? Parce que si je comprends bien, je voulais distinguer le flux et qui était une liste et non la carte.


J'ai ajouté une explication


3 Réponses :


2
votes

Vous pouvez utiliser distinct avec votre Stream existant lui-même:

List<BgwContract> contractListWithDuplicates = monthlyFeePaymentList
       .stream()
       .map(MonthlyFeePayment::getBgwContract) // Stream<BgwContract>
       .distinct() // here
       .collect(Collectors.toList());


0 commentaires

0
votes

Avec dintinct (), les éléments sont comparés en utilisant la méthode equals (). Vous devez remplacer equals () pour votre objet BgwContract.


0 commentaires

2
votes

Puisque vous vouliez une explication concernant l'emplacement correct de distinct :

Lorsque vous écrivez:

List<BgwContract> contractListWithDuplicates = monthlyFeePaymentList
           .stream()
           .map(MonthlyFeePayment::getBgwContract)
           .distinct()
           .collect(Collectors.toList());

vous obtenez un Flux d'instances MonthlyFeePayment distinctes (en fonction de l'implémentation equals de la classe MonthlyFeePayment ), puis mappez-les à BgwContract instances. Deux instances distinctes de MonthlyFeePayment peuvent être mappées à la même instance de BgwContract , de sorte que la List de sortie peut avoir des doublons.

Quand vous écrivez:

List<BgwContract> contractListWithDuplicates = monthlyFeePaymentList
           .stream()
           .distinct()
           .map(MonthlyFeePayment::getBgwContract)
           .collect(Collectors.toList());

vous mappez d'abord les instances MonthlyFeePayment aux instances BgwContract , puis supprimez ensuite les doublons avec distinct () , ce que vous voulez.


0 commentaires