”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在Java 8中实现嵌套对象的多级分组?

如何在Java 8中实现嵌套对象的多级分组?

发布于2024-11-07
浏览:812

How to Implement Multi-Level Grouping with Nested Objects in Java 8?

Java 8 中的多层分组使用 Nested GroupBy

本文探讨了在处理嵌套类时如何实现多层分组Java 8。具体来说,目标是按 key1 字段对项目进行分组,然后对于每组项目,进一步按 key2 字段对它们进行分组。最终,输出应该是一个以 key1 作为外键的映射,以及一个 key2 到子项列表的映射。

最初的方法尝试使用 Collectors.groupingBy 方法来实现这一点,但是,它是无法直接通过多个键对单个项目进行分组。为了克服这个问题,使用了 flatMap 操作。

一种方法涉及使用 Map.entrySet 创建一个临时对,以在收集之前保存项目和子项目的组合。 Java 9 中提供的另一种方法利用了 flatMapping 收集器,它可以直接在收集器中执行 flatMap 操作。

这是 flatMap 解决方案:

Map>> 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))));

在 Java 8 中使用自定义收集器的替代方案:

static  Collector flatMapping(
    Function super T,? extends Stream extends U>> mapper,
    Collector super U,A,R> downstream) {

    BiConsumer acc = downstream.accumulator();
    return Collector.of(downstream.supplier(),
        (a, t) -> { try(Stream extends U> s=mapper.apply(t)) {
            if(s!=null) s.forEachOrdered(u -> acc.accept(a, u));
        }},
        downstream.combiner(), downstream.finisher(),
        downstream.characteristics().toArray(new Collector.Characteristics[0]));
}

这个自定义收集器可以按如下方式使用:

Map>> result = pojo.getItems().stream()
    .collect(Collectors.groupingBy(Item::getKey1,
                Collectors.flatMapping(item -> item.getSubItems().stream(),
                    Collectors.groupingBy(SubItem::getKey2))));
版本声明 本文转载于:1729730703如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 Next.js 中使用 React 服务器组件和服务器操作
    在 Next.js 中使用 React 服务器组件和服务器操作
    简介:使用 React 服务器组件增强 Next.js Next.js 已经发展到包含 React Server Components 和 Server Actions 等强大功能,它们提供了一种处理服务器端渲染和逻辑的新方法。这些功能提供了一种更高效、更简化的方法来构建 Web ...
    编程 发布于2024-11-07
  • 为什么我在 Java 中收到“无法对非静态字段进行静态引用”错误?
    为什么我在 Java 中收到“无法对非静态字段进行静态引用”错误?
    避免“无法对非静态字段进行静态引用”错误在Java编程中,“无法对非静态字段进行静态引用”错误尝试在静态方法中访问非静态字段(也称为实例变量)时,会发生“引用非静态字段”错误。在提供的代码中,出现错误是因为 main 方法被声明为静态,这意味着它只能引用类的静态成员,包括静态方法和字段。然而,字段b...
    编程 发布于2024-11-07
  • ## 为什么 Visual Studio 突出显示 __int128 但无法编译它?
    ## 为什么 Visual Studio 突出显示 __int128 但无法编译它?
    Visual Studio 中的 __int128 兼容性问题排查虽然 Visual Studio 的语法突出显示表明 __int128 数据类型可用,但编译错误表明当前体系结构不支持它。当尝试在 Visual Studio 中的 C 项目中使用此 128 位整数类型时,会出现此问题。 Ursach...
    编程 发布于2024-11-07
  • 在 TypeScript 的类组件的构造函数中是否总是需要定义 `props` 和 `state` ?
    在 TypeScript 的类组件的构造函数中是否总是需要定义 `props` 和 `state` ?
    当使用 TypeScript 在 React 中处理类组件时,经常会被问到是否有必要且强制在构造函数中定义 props 和 state 的问题。这个问题的答案取决于组件的具体需求。在这篇博文中,我们将了解何时以及为何使用构造函数来定义 props 和状态,以及不同方法的优缺点。 使用...
    编程 发布于2024-11-07
  • 为什么多年的经验让我选择全栈而不是平均栈
    为什么多年的经验让我选择全栈而不是平均栈
    在全栈和平均栈开发方面工作了 6 年多,我可以告诉你,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我对两者的经验能给您一些有用的见解。 在这篇文章中,我将带...
    编程 发布于2024-11-07
  • 如何处理 Python Base64 解码中不正确的填充错误?
    如何处理 Python Base64 解码中不正确的填充错误?
    在Python Base64解码中处理不正确的填充在Python中使用base64.decodestring()解码base64编码的数据时,你可能会遇到“填充不正确”错误。要绕过这个问题,您可以考虑几种方法。1。添加填充根据接受的答案中的建议,您可以在解码之前简单地添加最大可能的填充字符。在 Py...
    编程 发布于2024-11-07
  • PHP 可以像 JavaScript 一样将函数作为参数传递吗?
    PHP 可以像 JavaScript 一样将函数作为参数传递吗?
    在 PHP 中将函数作为参数传递将函数作为数据元素进行操作是现代编程中常用的一种通用技术。一个这样的例子是将函数作为参数传递,这是 5.3 之前的 PHP 版本中不容易使用的功能。现在,我们深入研究此功能,探索何时以及如何使用它。问题: 函数可以在 PHP 中作为参数传递吗,类似于 JavaScri...
    编程 发布于2024-11-07
  • 反思 GSoC 4
    反思 GSoC 4
    Achievements, Lessons, and Tips for Future Success An exciting summer has come to a close for stdlib with our first participation in Google Summer of...
    编程 发布于2024-11-07
  • 在 Go 中如何将字节数组转换为有符号整数和浮点数?
    在 Go 中如何将字节数组转换为有符号整数和浮点数?
    Go 中将字节数组转换为有符号整数和浮点数在 Go 中,二进制包提供了从 []byte 转换无符号整数的函数数组,例如binary.LittleEndian.Uint16()和binary.BigEndian.Uint32()。然而,有符号整数或浮点数没有直接等价物。缺少有符号整数转换函数的原因缺少...
    编程 发布于2024-11-07
  • 如何修复 Java + MySQL UTF-8 编码问题:为什么我的特殊字符显示为问号?
    如何修复 Java + MySQL UTF-8 编码问题:为什么我的特殊字符显示为问号?
    Java MySQL UTF-8 编码问题您提到了使用 Java 和 MySQL 时经常遇到的问题,其中存储了特殊字符作为问号(“?”)。当 MySQL 数据库、表和列设置为使用 UTF-8 字符编码,但 JDBC 连接未正确配置时,就会出现此问题。在您的代码中,在建立与数据库的连接时,您可以指定附...
    编程 发布于2024-11-07
  • 令牌桶算法:流量管理必备指南
    令牌桶算法:流量管理必备指南
    令牌桶算法是控制网络流量、确保公平带宽使用和防止网络拥塞的流行机制。它的运作原理很简单,即根据令牌可用性来调节数据传输,其中令牌代表发送一定量数据的权利。该算法对于维护各种系统(包括网络、API 和云服务)中的流量至关重要,提供了一种在不造成资源过载的情况下管理流量的方法。 令牌桶算法如何工作 令...
    编程 发布于2024-11-07
  • 如何为您的 Python 项目选择最佳的 XML 库?
    如何为您的 Python 项目选择最佳的 XML 库?
    Python 中的 XML 创建:库和方法综合指南在 Python 中创建 XML 文档时,开发人员可以选择各种库选项处理。最流行和最直接的选择是 ElementTree API,它是 Python 标准库自 2.5 版以来不可或缺的一部分。ElementTree:高效选项ElementTree 提...
    编程 发布于2024-11-07
  • 如何使用多个字段对 Java 中的对象列表进行排序?
    如何使用多个字段对 Java 中的对象列表进行排序?
    Java 中具有多个字段的列表对象的自定义排序虽然基于一个字段对列表中的对象进行排序很简单,但使用多个字段进行排序可能有点棘手。本文深入研究按多个字段排序的问题,并探讨 Java 中可用的各种解决方案。问题考虑一个场景,其中您有一个包含三个字段的“Report”对象列表:ReportKey、学号和学...
    编程 发布于2024-11-07
  • 如何使用递归从具有父类别的数据库生成嵌套菜单树?
    如何使用递归从具有父类别的数据库生成嵌套菜单树?
    菜单树生成的递归在您的情况下,您有一个数据库结构,其中类别有一个“根”字段指示其父类别。您想要的 HTML 输出涉及表示类别层次结构的嵌套列表。为此,可以使用递归 PHP 函数。这是一个示例函数:function recurse($categories, $parent = null, $level...
    编程 发布于2024-11-07
  • Array_column 函数可以用于对象数组吗?
    Array_column 函数可以用于对象数组吗?
    将 array_column 与对象数组一起使用本题探讨了将 array_column 函数与由对象组成的数组一起使用的可行性。开发人员实现了 ArrayAccess 接口,但发现它没有任何影响。PHP 5在 PHP 7 之前,array_column 本身不支持对象数组。要解决此限制,可以使用替代...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3