Maison >Java >javaDidacticiel >Comment puis-je regrouper des données par plusieurs champs à l'aide de Java 8 Streams ?

Comment puis-je regrouper des données par plusieurs champs à l'aide de Java 8 Streams ?

DDD
DDDoriginal
2024-11-26 11:13:09936parcourir

How Can I Group Data by Multiple Fields Using Java 8 Streams?

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!

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