Intersection de deux listes en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons apprendre à récupérer l'intersection de deux List s.

Comme beaucoup d'autres choses, cela est devenu beaucoup plus facile grâce à l'introduction de flux dans Java 8.

2. Intersection de deux listes de chaînes

Créons deux listes de chaînes avec une intersection - les deux ayant des éléments dupliqués:

List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");

Et maintenant, nous allons déterminer l'intersection des listes à l'aide des méthodes de flux :

Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);

Tout d'abord, nous supprimons les éléments dupliqués avec distinct . Ensuite, nous utilisons le filtre pour sélectionner les éléments qui sont également contenus dans otherList .

Enfin, nous convertissons notre sortie avec un collecteur . L'intersection ne doit contenir chaque élément commun qu'une seule fois. L'ordre ne devrait pas avoir d'importance, donc toSet est le choix le plus simple, mais nous pouvons également utiliser toList ou une autre méthode de collecte.

Pour plus de détails, consultez notre guide des collectionneurs de Java 8.

3. Intersection de listes de classes personnalisées

Que faire si nos List ne contiennent pas de String mais plutôt des instances d'une classe personnalisée que nous avons créée? Eh bien, tant que nous suivons les conventions de Java, la solution avec les méthodes de flux fonctionnera bien pour notre classe personnalisée.

Comment la méthode contains décide-t-elle si un objet spécifique apparaît dans une liste? Basé sur la méthode égale . Ainsi, nous devons remplacer la méthode equals et nous assurer qu'elle compare deux objets en fonction des valeurs des propriétés pertinentes.

Par exemple, deux rectangles sont égaux si leurs largeurs et hauteurs sont égales.

Si nous ne remplaçons pas la méthode equals , notre classe utilise l' implémentation equals de la classe parent. À la fin de la journée, ou plutôt de la chaîne d'héritage, la méthode equals de la classe Object est exécutée. Ensuite, deux instances ne sont égales que si elles font référence exactement au même objet sur le tas.

Pour plus d'informations sur la méthode equals , consultez notre article sur les contrats Java equals () et hashCode () .

4. Conclusion

Dans cet article rapide, nous avons vu comment utiliser des flux pour calculer l'intersection de deux listes. Il existe de nombreuses autres opérations qui étaient assez fastidieuses mais qui sont assez simples si nous connaissons notre chemin autour de l'API Java Stream. Jetez un œil à nos autres tutoriels avec les flux Java ici.

Des exemples de code sont disponibles à l'adresse over sur GitHub.