
本文详细阐述了如何在groovy中将扁平化的数据列表根据共同的键进行分组,并将其重构为具有清晰父子层级关系的嵌套结构。通过利用groovy强大的`groupby`和`collect`方法,本教程提供了一种高效且灵活的数据转换方案,适用于需要对数据进行聚合和结构化展示的场景,从而提升数据的可读性和可用性。
在数据处理和分析中,我们经常会遇到需要将一系列扁平化记录根据某个共同属性进行分组,并将其组织成更具结构化的父子关系。例如,您可能有一个包含多条保险或健康记录的列表,希望根据“险种类型”将它们归类,并将每种险种下的所有相关记录作为其“子项”进行嵌套。Groovy作为一种动态语言,提供了简洁而强大的集合操作方法,能够高效地实现这种数据重构。
假设我们有以下列表,其中每个元素都是一个Map,代表一条记录:
def fakeList = [
[coverageType: 'health', amount: 9, expireDate: 2020],
[coverageType: 'insurance', amount: 10, expireDate: 2020],
[coverageType: 'health', amount: 9, expireDate: 2021],
]我们的目标是将这些记录按照coverageType字段进行分组,并生成一个包含parent(父级类型)和children(子级记录列表)的嵌套结构。
我们希望得到的最终数据结构如下所示:
[
[
parent: 'health',
children: [
[
coverageType: 'health',
amount: '9',
expireDate: '2020'
],
[
coverageType: 'health',
amount: '9',
expireDate: '2021'
],
]
],
[
parent: 'insurance',
children: [
[
coverageType: 'insurance',
amount: '10', // 注意这里是10,不是9
expireDate: '2020'
]
]
],
]或者,如果子项不需要保留原始键,也可以简化为:
[
[
parent: 'health',
children: [
['health', '9', '2020'],
['health', '9', '2021'],
]
],
[
parent: 'insurance',
children: [
['insurance', '10', '2020']
]
],
]本教程将重点实现第一种更详细的嵌套结构。
Groovy的groupBy方法是实现数据分组的关键,它能够根据指定的闭包(closure)将列表中的元素分组到一个Map中,其中键是闭包的返回值,值是对应分组的元素列表。接着,我们可以使用collect方法遍历这个分组后的Map,将其转换为我们期望的父子结构列表。
以下是实现上述目标的Groovy代码:
def fakeList = [
[coverageType: 'health', amount: 9, expireDate: 2020],
[coverageType: 'insurance', amount: 10, expireDate: 2020],
[coverageType: 'health', amount: 9, expireDate: 2021],
]
// 步骤1: 使用 groupBy 将列表按 coverageType 分组
def groupedData = fakeList.groupBy { it.coverageType }
/*
groupedData 的中间结果大致如下:
[
health: [
[coverageType: 'health', amount: 9, expireDate: 2020],
[coverageType: 'health', amount: 9, expireDate: 2021]
],
insurance: [
[coverageType: 'insurance', amount: 10, expireDate: 2020]
]
]
*/
// 步骤2: 使用 collect 转换分组后的数据为期望的父子结构
def resultList = groupedData.collect { coverageType, items ->
def parentChildMap = [:]
parentChildMap.parent = coverageType // 设置父级类型
parentChildMap.children = items.collect { item ->
// 为每个子项创建一个新的Map,并进行必要的类型转换
[
coverageType: item.coverageType,
amount: item.amount as String, // 将数字转换为字符串
expireDate: item.expireDate as String // 将数字转换为字符串
]
}
parentChildMap
}
println resultListfakeList.groupBy { it.coverageType }:
groupedData.collect { coverageType, items -> ... }:
def parentChildMap = [:]:
parentChildMap.parent = coverageType:
parentChildMap.children = items.collect { item -> ... }:
执行上述代码,将得到以下输出,这与我们期望的带有详细子项的父子结构完全一致:
[[parent:health, children:[[coverageType:health, amount:9, expireDate:2020], [coverageType:health, amount:9, expireDate:2021]]], [parent:insurance, children:[[coverageType:insurance, amount:10, expireDate:2020]]]]
为了更清晰地展示,可以对其进行格式化输出:
import groovy.json.JsonOutput println JsonOutput.prettyPrint(JsonOutput.toJson(resultList))
输出:
[
{
"parent": "health",
"children": [
{
"coverageType": "health",
"amount": "9",
"expireDate": "2020"
},
{
"coverageType": "health",
"amount": "9",
"expireDate": "2021"
}
]
},
{
"parent": "insurance",
"children": [
{
"coverageType": "insurance",
"amount": "10",
"expireDate": "2020"
}
]
}
]通过本教程,您应该已经掌握了在Groovy中利用groupBy和collect方法将扁平数据重构为父子层级结构的技巧。这种模式在数据聚合、报表生成以及API数据准备等场景中都非常有用,极大地简化了复杂的数据转换逻辑。
以上就是使用Groovy对列表数据进行分组与重构:实现父子层级结构的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号