Regroupement par plusieurs champs en Java 8
Dans Java 8, la méthode Collectors.groupingBy() est couramment utilisée pour regrouper des objets en fonction de un domaine spécifique. Cependant, que se passe-t-il si vous devez regrouper par plusieurs champs d'un même POJO ?
Plusieurs options sont disponibles :
Chaînage des collecteurs
Map<String, Map<Integer, List<Person>>> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));
Ce code regroupe les objets Personne d'abord par nom puis par âge, ce qui donne une structure cartographique imbriquée.
Définition une classe de regroupement
class Person { record NameAge(String name, int age) { } public NameAge getNameAge() { return new NameAge(name, age); } } Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));
En créant un enregistrement ou une classe qui encapsule les critères de regroupement (par exemple, NameAge), vous pouvez directement regrouper selon les champs souhaités.
Utilisation d'une classe paire
import org.apache.commons.lang3.tuple.Pair; Map<Pair<String, Integer>, List<Person>> map = people .collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));
Si vous utilisez une bibliothèque tierce, vous pouvez tirer parti sa classe de paires pour représenter les critères de regroupement.
Choisir la meilleure option
Le choix de l'approche dépend des exigences spécifiques de votre projet :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!