Maison >Java >javaDidacticiel >Comment puis-je regrouper des données par plusieurs champs dans Java 8 à l'aide de « Collectors.groupingBy() » ?

Comment puis-je regrouper des données par plusieurs champs dans Java 8 à l'aide de « Collectors.groupingBy() » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-24 10:27:11663parcourir

How Can I Group Data by Multiple Fields in Java 8 Using `Collectors.groupingBy()`?

Regroupement par plusieurs champs dans Java 8, au-delà du regroupement par champ unique

Le regroupement d'objets par un seul champ est une opération courante dans le traitement des données. Cependant, des scénarios peuvent survenir dans lesquels un regroupement par plusieurs champs est nécessaire. L'extrait de code initial fourni montre le regroupement par champ d'âge. Cet article examine les options de regroupement par plusieurs champs du même POJO.

Chaînage des collecteurs

Une approche simple consiste à enchaîner plusieurs collecteurs. Le code ci-dessous démontre cette technique :

Map<String, Map<Integer, List<Person>>> map = people
    .collect(Collectors.groupingBy(Person::getName,
        Collectors.groupingBy(Person::getAge));

Avec cette approche, pour récupérer une liste d'individus de 18 ans nommés Fred :

map.get("Fred").get(18);

Définir un enregistrement de regroupement

Créer une classe qui représente le regroupement est une autre méthode. Ici, un enregistrement est utilisé pour représenter la combinaison du nom et de l'âge :

class Person {
    record NameAge(String name, int age) {}

    public NameAge getNameAge() {
        return new NameAge(name, age);
    }
}

Ensuite, le regroupement peut être effectué comme suit :

Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));

Pour rechercher dans les données groupées :

map.get(new NameAge("Fred", 18));

Utilisation de classes de paires à partir de bibliothèques-cadres

Bibliothèques comme Apache Commons, propose des classes de paires pour ce type de scénario. Avec une classe paire, la clé de la carte peut être construite comme :

Map<Pair<String, Integer>, List<Person>> map =
    people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));

Pour récupérer de la carte :

map.get(Pair.of("Fred", 18));

Conclusion

La méthode Collectors.groupingBy() de Java 8 offre une flexibilité dans le regroupement des données. Cet article a démontré différentes approches pour étendre le regroupement au-delà d'un seul champ, notamment le chaînage de collecteurs, la définition d'un enregistrement de regroupement personnalisé et l'utilisation de classes de paires à partir de bibliothèques-cadres. De plus, les enregistrements en Java facilitent la définition de critères de regroupement sans avoir besoin de classes personnalisées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn