Regroupement multi-niveaux Java 8 avec collecteurs imbriqués
Le regroupement multi-niveaux, également connu sous le nom de regroupement imbriqué, implique l'agrégation de données par plusieurs clés à travers différents niveaux d’une hiérarchie d’objets imbriqués. Dans Java 8, vous pouvez y parvenir à l'aide de collecteurs imbriqués.
Considérez un scénario dans lequel vous avez des classes telles que Pojo, Item et SubItem, où chaque Pojo a une liste d'éléments et chaque élément a un liste des sous-éléments. L'objectif est de regrouper les éléments par leur champ clé1, et pour chaque groupe, d'agréger davantage les sous-éléments par leur champ clé2.
Pour effectuer ce regroupement imbriqué, vous pouvez utiliser Collectors.groupingBy avec une structure imbriquée :
<code class="java">pojo.getItems() .stream() .collect( Collectors.groupingBy(Item::getKey1, **// How to group by SubItem::getKey2 here**));</code>
La question réside dans le deuxième paramètre de Collectors.groupingBy - comment regrouper les sous-éléments par clé2 au sein de chaque groupe clé1. La solution ne peut pas utiliser groupingBy en cascade, car elle regroupe uniquement par champs au sein du même objet.
La réponse implique d'utiliser Stream.flatMap pour créer un flux de paires clé-valeur, où la clé est Item.key1 et le la valeur est SubItem.key2. Ce flux est ensuite regroupé à l'aide de Collectors.groupingBy pour obtenir le regroupement imbriqué souhaité :
<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream() .flatMap(item -> item.getSubItems().stream() .map(sub -> new AbstractMap.SimpleImmutableEntry<>(item.getKey1(), sub))) .collect(Collectors.groupingBy(AbstractMap.SimpleImmutableEntry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.groupingBy(SubItem::getKey2))));</code>
Alternativement, avec Collectors.flatMapping de Java 9, la solution se simplifie en :
<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream() .collect(Collectors.groupingBy(Item::getKey1, Collectors.flatMapping(item -> item.getSubItems().stream(), Collectors.groupingBy(SubItem::getKey2))));</code>
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!