Regroupement par plusieurs champs dans Java 8
Lors du regroupement d'objets par nom de champ, Java 8 fournit la méthode Collectors.groupingBy(). Cependant, que se passe-t-il si nous devons regrouper par plusieurs champs ?
Option 1 : Chaînage des collecteurs
Une approche consiste à chaîner plusieurs appels Collectors.groupingBy() :
Map<String, Map<Integer, List<Person>>> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge)));
Cela crée une carte imbriquée où le premier niveau est regroupé par nom et le deuxième niveau est regroupé par âge. Pour récupérer une liste de personnes de 18 ans prénommées Fred :
map.get("Fred").get(18);
Option 2 : Définir un enregistrement de regroupement
Alternativement, on peut créer une classe ( par exemple, NameAge) qui représente les champs de regroupement :
class NameAge implements Comparable<NameAge> { String name; int age; // Constructor, getters, compareTo, etc. }
Ensuite, regroupez par NameAge record :
Map<NameAge, List<Person>> map = people .collect(Collectors.groupingBy(Person::getNameAge));
Pour récupérer :
map.get(new NameAge("Fred", 18));
Option 3 : Utiliser la classe Pair
Si la mise en œuvre d'un enregistrement de regroupement personnalisé n'est pas souhaitable, nous pouvons utiliser une classe paire à partir de bibliothèques comme Apache Commons ou le nouveau java.util.function.Pair de Java. Par exemple, avec Apache Commons :
Map<Pair<String, Integer>, List<Person>> map = people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));
Pour récupérer :
map.get(Pair.of("Fred", 18));
Recommandation
Le choix de l'approche dépend des exigences spécifiques . Les enregistrements offrent une solution concise et claire, mais des bibliothèques comme Apache Commons peuvent être préférées pour des scénarios plus complexes.
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!