Pour dédoublonnner une collection d'objets en fonction d'un attribut spécifique et générer une nouvelle liste unique en Java, la combinaison des méthodes Collectors.collectingAndThen et toCollection offre une solution élégante. Voici un exemple concret utilisant une classe Employe avec les propriétés identifiant et nom.
package exemples.streams;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
public class GestionEmployes {
public static void main(String[] args) {
List<Employe> listeOriginale = new ArrayList<>();
listeOriginale.add(new Employe("E101", "Alice"));
listeOriginale.add(new Employe("E102", "Bob"));
listeOriginale.add(new Employe("E103", "Charlie"));
listeOriginale.add(new Employe("E104", "Diana"));
listeOriginale.add(new Employe("E102", "Eve"));
listeOriginale.add(new Employe("E103", "Frank"));
// Déduplication basée sur l'identifiant, en préservant le premier élément rencontré
List<Employe> listeDedoublonnee = listeOriginale.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Employe::getIdentifiant))),
ArrayList::new
));
listeDedoublonnee.forEach(System.out::println);
System.out.println("---------------");
// Version alternative avec des fonctions anonymes pour plus de clarté
List<Employe> resultatAlternative = listeOriginale.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> {
return new TreeSet<>(Comparator.comparing(emp -> emp.getIdentifiant()));
}),
ensemble -> new ArrayList<>(ensemble)
));
resultatAlternative.forEach(System.out::println);
}
}
class Employe {
private String identifiant;
private String nom;
public Employe(String identifiant, String nom) {
this.identifiant = identifiant;
this.nom = nom;
}
public String getIdentifiant() {
return identifiant;
}
@Override
public String toString() {
return "Employe(identifiant='" + identifiant + "', nom='" + nom + "')";
}
}
Ce code génère les sorties suivnates après exécution :
Employe(identifiant='E101', nom='Alice')
Employe(identifiant='E102', nom='Bob')
Employe(identifiant='E103', nom='Charlie')
Employe(identifiant='E104', nom='Diana')
---------------
Employe(identifiant='E101', nom='Alice')
Employe(identifiant='E102', nom='Bob')
Employe(identifiant='E103', nom='Charlie')
Employe(identifiant='E104', nom='Diana')