首页 >Java >java教程 >如何在 Java 8 中基于多个属性执行嵌套分组

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

DDD
DDD原创
2024-10-24 08:39:02252浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn