Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Élimination des doublons avec la méthode distinct() | Section
API Stream en Java

bookÉlimination des doublons avec la méthode distinct()

Glissez pour afficher le menu

Dans le développement réel, il est fréquent de rencontrer des situations où les données contiennent des doublons qu'il est nécessaire de supprimer. Par exemple, imaginez que vous compiliez une liste de participants à une conférence, mais qu'en raison d'erreurs système, certains noms aient été enregistrés deux fois.

La méthode distinct() permet de résoudre ce problème en éliminant les éléments dupliqués d'un flux.

Stream<T> distinct()

Cette méthode retourne un flux ne contenant que des éléments uniques, en filtrant tous les doublons.

Fonctionnement

La méthode distinct() s'appuie sur hashCode() pour détecter rapidement les doublons potentiels et sur equals() pour confirmer s'ils sont réellement identiques. Si deux objets ont des codes de hachage différents, ils sont considérés comme uniques. Si les codes de hachage correspondent, equals() est appelé pour vérifier leur égalité selon des critères spécifiques.

Ensemble, ces méthodes forment le hashCode() et le equals() contrat, garantissant une comparaison correcte et une suppression des doublons.

Au lieu de les écrire manuellement, IntelliJ IDEA permet de les générer automatiquement.

Dans IntelliJ IDEA, le menu de génération de code a été ouvert (Alt + Insert sous Windows/Linux, Cmd + N sous Mac) et equals() ainsi que hashCode() ont été sélectionnés. Après avoir choisi les champs à inclure dans la comparaison, IDEA a généré automatiquement les méthodes nécessaires.

Exemple pratique

Une usine suit la production de pièces, mais le rapport contient des doublons ainsi que des pièces défectueuses étiquetées DEFECT. L'objectif est de nettoyer la liste, en conservant uniquement les pièces uniques et non défectueuses, de les trier par nom et de les afficher au format : Name - Serial Number.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }

Pour supprimer les doublons et filtrer les pièces défectueuses, les méthodes equals() et hashCode() doivent être correctement implémentées afin de comparer les pièces par numéro de série.

Ensuite, il faut utiliser distinct() pour éliminer les doublons, filter() pour retirer les pièces défectueuses contenant DEFECT dans leur nom, sorted() pour trier les pièces restantes, et map() pour les formater en chaînes de caractères.

1. Qu'est-ce qui est utilisé pour comparer les éléments dans la méthode distinct() ?

2. Si deux objets ont le même hashCode(), mais que leur méthode equals() retourne false, seront-ils considérés comme identiques dans la méthode distinct() ?

question mark

Qu'est-ce qui est utilisé pour comparer les éléments dans la méthode distinct() ?

Select the correct answer

question mark

Si deux objets ont le même hashCode(), mais que leur méthode equals() retourne false, seront-ils considérés comme identiques dans la méthode distinct() ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 22

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 1. Chapitre 22
some-alt