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());
3 Réponses :
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());
Avec dintinct (), les éléments sont comparés en utilisant la méthode equals (). Vous devez remplacer equals () pour votre objet BgwContract.
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.
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