La fusion de deux listes d'objets dans java 8
J'ai une classe Java Parent
avec 20 attributs (attrib1, attrib2 .. attrib20)
et de ses getters et setters. Aussi, j'ai deux listes de Parent
objets: list1
et list2
.
Maintenant, je veux fusionner les deux listes et éviter de dupliquer des objets sur la base des attrib1
et attrib2
.
À L'Aide De Java 8:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
Mais dans lequel la place, je dois spécifier les attributs? Dois-je remplacer hashCode
et equals
méthode?
- Utiliser Set pour éviter les doublons.
- Voir stackoverflow.com/questions/27870136/...
- Cool echo fonctionnalité vous en êtes arrivé là 🙂
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez mettre en œuvre
equals
ethashCode
, l'endroit pour le faire est à l'intérieur de la classeParent
. Au sein de cette classe d'ajouter les méthodes commeSi vous avez fait cela,
distinct()
invoquée sur unStream<Parent>
va automatiquement faire la bonne chose.Si vous ne voulez pas (ou ne peuvent pas) changer la classe
Parent
, il n'existe pas de mécanisme de délégation pour l'égalité, mais on peut avoir recours à commande que qui a un mécanisme de délégation:Ceci définit un ordre basé sur les propriétés. Il exige que les types des attributs lui sont comparables. Si vous avez une telle définition, vous pouvez l'utiliser pour mettre en œuvre l'équivalent d'un
distinct()
sur la base de laComparator
:Il y a aussi un thread-safe variante, dans le cas où vous souhaitez l'utiliser avec des flux parallèles:
expression::name
que l'expression est évaluée en premier, et le résultat capturé par l'interface fonctionnelle de l'instance qui sera seulement d'invoquer la méthode sur cet objet. Voir, par exemple, “Quel est l'équivalent d'expression lambda pour le Système.out::println? Ou ce Q&A ou que Q&APar exemple:
Si vous souhaitez remplacer
.equals(…)
et.hashCode()
, vous avez besoin de le faire sur leParent
classe. Notez que cela peut entraîner d'autres utilisations deParent
à l'échec. Alexis C. est lié solution est plus conservateur.Remplacer la
equals
ethashCode
méthodes deParent
classe pour éviter les doublons dans les listes. Cela vous donnera le résultat exact de ce que vous voulez.equals
sans aussi primordialhashCode
.