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
Libérer: 2024-11-26 11:13:09
original
913 Les gens l'ont consulté

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)));
Copier après la connexion

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);
Copier après la connexion

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.
}
Copier après la connexion

Ensuite, regroupez par NameAge record :

Map<NameAge, List<Person>> map = people
                .collect(Collectors.groupingBy(Person::getNameAge));
Copier après la connexion

Pour récupérer :

map.get(new NameAge("Fred", 18));
Copier après la connexion

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())));
Copier après la connexion

Pour récupérer :

map.get(Pair.of("Fred", 18));
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal