首页 > Java > java教程 > 正文

Groovy中高效构建列表分组与嵌套父子结构

霞舞
发布: 2025-10-16 10:14:23
原创
210人浏览过

Groovy中高效构建列表分组与嵌套父子结构

本文详细介绍了如何在groovy中将扁平化的数据列表根据特定字段进行分组,并将其重构为具有父子关系的嵌套数据结构。通过利用groovy强大的`groupby`和`collect`方法,可以简洁高效地实现数据的分类、转换和格式化,从而满足复杂的数据组织需求。

在数据处理和转换中,我们经常需要将一个包含多个相同类型元素的扁平列表,按照某个共同的属性进行分组,并将其组织成一个更具层次感的结构,例如父子关系。这种结构化处理对于后续的数据展示、分析或API响应格式化至关重要。本文将以一个具体的示例,演示如何使用Groovy的集合操作,优雅地实现这一目标。

初始数据结构

假设我们有一个fakeList,其中包含多个表示不同保险覆盖类型的Map对象:

def fakeList = [
    [coverageType: 'health', amount: 9, expireDate: 2020], 
    [coverageType: 'insurance', amount: 10, expireDate: 2020], 
    [coverageType: 'health', amount: 9, expireDate: 2021],
]
登录后复制

我们的目标是将其转换为一个列表,其中每个元素代表一个唯一的coverageType(作为父级),并包含所有属于该coverageType的原始项(作为子级)。

目标数据结构

期望的输出格式如下所示,每个父级Map包含一个parent键和一个childs(或children)键,childs键的值是一个列表,包含了所有相关的子项:

[
    [parent:'health', childs:[
        [coverage:health, amount:9, expireDate:2020], 
        [coverage:health, amount:9, expireDate:2021]
    ]],
    [parent:'insurance', childs:[
        [coverage:insurance, amount:10, expireDate:2020]
    ]]
]
登录后复制

Groovy解决方案:groupBy与collect的组合应用

Groovy提供了强大的集合处理方法,其中groupBy和collect是实现此目标的理想工具

  1. groupBy方法:groupBy方法用于根据闭包的返回值对集合元素进行分组。它返回一个Map,其中键是闭包的返回值(即分组依据),值是包含所有属于该组的元素的列表。

    妙构
    妙构

    AI分析视频内容,专业揭秘爆款视频

    妙构111
    查看详情 妙构
    def groupedByCoverage = fakeList.groupBy { it.coverageType }
    // groupedByCoverage 的结果大致如下:
    // [
    //   health:[[coverageType:health, amount:9, expireDate:2020], [coverageType:health, amount:9, expireDate:2021]],
    //   insurance:[[coverageType:insurance, amount:10, expireDate:2020]]
    // ]
    登录后复制
  2. collect方法:collect方法用于将集合中的每个元素转换为一个新的元素,并返回一个包含所有新元素的列表。在这里,我们将对groupBy的结果(一个Map)使用collect,将每个键值对(coverageType和其对应的列表)转换为我们所需的父子结构Map。

    def groupList = fakeList.groupBy { it.coverageType } // 首先按 coverageType 分组
                            .collect { coverageType, items -> // 对每个分组进行转换
        def map = [:] // 创建一个空的Map来构建父级结构
        map.'parent' = coverageType // 设置父级名称
        map.'childs' = items.collect { item -> // 遍历当前分组的子项,构建子项列表
            def childMap = [:] // 为每个子项创建一个Map
            childMap.'coverage' = coverageType // 添加子项的 coverage 类型
            childMap.'amount' = item.amount as String // 转换并添加 amount
            childMap.'expireDate' = item.expireDate as String // 转换并添加 expireDate
            childMap // 返回子项Map
        }
        map // 返回父级Map
    }
    登录后复制

完整示例代码

将上述步骤整合,完整的Groovy代码如下:

import java.util.stream.Collectors

// 原始数据列表
def fakeList = [
    [coverageType: 'health', amount: 9, expireDate: 2020], 
    [coverageType: 'insurance', amount: 10, expireDate: 2020], 
    [coverageType: 'health', amount: 9, expireDate: 2021],
] 

// 使用 groupBy 和 collect 实现分组和结构化
def groupList = fakeList.groupBy { it.coverageType }
                        .collect { coverageType, items ->
        def parentMap = [:]
        parentMap.'parent' = coverageType 
        parentMap.'childs' = items.collect { item ->
            def childMap = [:]
            childMap.'coverage' = coverageType
            childMap.'amount' = item.amount as String // 注意:这里将数字转换为字符串
            childMap.'expireDate' = item.expireDate as String // 注意:这里将数字转换为字符串
            childMap
        }
        parentMap
}

// 打印结果
println groupList
登录后复制

运行结果

执行上述代码,将得到以下输出,这正是我们期望的父子结构:

[
    [parent:health, childs:[[coverage:health, amount:9, expireDate:2020], [coverage:health, amount:9, expireDate:2021]]],
    [parent:insurance, childs:[[coverage:insurance, amount:10, expireDate:2020]]]
]
登录后复制

注意事项与总结

  1. putAll的误用: 在原始问题中,用户尝试使用putAll来添加数组,但putAll通常用于将一个Map的所有键值对复制到另一个Map中,它会覆盖同名的键。对于列表的追加或嵌套,这种方法是不合适的。
  2. 类型转换: 在示例代码中,amount和expireDate字段被显式地转换为String类型(item.amount as String)。如果你的目标输出要求特定类型,务必进行相应的类型转换。
  3. Groovy的简洁性: groupBy和collect是Groovy集合操作的强大体现,它们允许用非常简洁和富有表达力的方式处理复杂的数据转换逻辑,避免了冗长的循环和条件判断。
  4. 灵活性: collect闭包内部可以根据需求进行任意复杂的转换逻辑。你可以选择性地包含或排除原始项的字段,甚至添加新的计算字段。

通过掌握groupBy和collect的组合使用,你将能够高效地在Groovy中处理各种数据分组和结构化任务,从而编写出更健壮、更易读的代码。

以上就是Groovy中高效构建列表分组与嵌套父子结构的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号