首页 > Java > java教程 > 正文

如何在 Java 8 中基于多个属性执行嵌套分组

DDD
发布: 2024-10-24 08:39:02
原创
173 人浏览过

How to Perform Nested Grouping based on Multiple Properties in Java 8

Java 8 中针对复杂对象结构的嵌套分组

在 Java 8 中,Collectors.groupingBy 方法提供了一种强大的方法来根据关于特定属性。这使您可以有效地聚合和汇总数据。但是,如果要执行多个级别的分组,情况又如何呢?

考虑以下类结构:

<code class="java">class Pojo {
    List<Item> items;
}

class Item {
    T key1;
    List<SubItem> subItems;
}

class SubItem {
    V key2;
    Object otherAttribute1;
}</code>
登录后复制

目标是根据 key1 对项目进行分组,然后对每个项目进行分组item group,根据key2进一步分组子item。所需的输出是以下形式的映射:

<code class="java">Map<T, Map<V, List<SubItem>>></code>
登录后复制

使用标准 Collectors.groupingBy 不足以满足此场景。挑战在于通过多个键对单个项目进行分组。

解决方案:扁平化结构

解决此问题的关键是暂时扁平化结构。通过这样做,您可以在执行必要的分组之前创建 Item 和 SubItem 的组合流。

一种方法是使用 Stream.flatMap 方法创建 Map.Entry 对象流,其中每个条目代表一对 Item 和 SubItem:

<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
    .flatMap(item -> item.subItems.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>
登录后复制

Collectors.flatMapping 的替代解决方案(Java 9 )

在 Java 9 及更高版本中,更优雅的方法是使用 Collectors.flatMapping 收集器可用:

<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>
登录后复制

结论

通过利用 Streams、Collectors 和临时对象扁平化,甚至可以实现嵌套分组Java 8 及更高版本中的复杂对象结构。

以上是如何在 Java 8 中基于多个属性执行嵌套分组的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!