Groovy多属性分组提取值:实现灵活多层嵌套映射方案
通用Groovy多层嵌套列表转Map实现
这里有一个灵活的通用方法,可以轻松处理任意层级的嵌套转换,彻底解决层级增多时代码嵌套繁琐、可读性差的问题:
def nest(List items, List keys, String valueKey = 'value') { items.inject([:]) { map, item -> def current = map // 逐层构建嵌套Map,直到倒数第二层 keys[0..-2].each { key -> def keyValue = item[key] current[keyValue] = current[keyValue] ?: [:] current = current[keyValue] } // 为最后一层键设置对应的值 def lastKey = keys[-1] current[item[lastKey]] = item[valueKey] map } }
方法说明
这个方法的三个参数作用如下:
items: 需要转换的原始列表keys: 按嵌套层级顺序排列的键名列表(比如要实现两层嵌套就传['category', 'name'],四层嵌套就传['category', 'subcategory', 'group', 'name'])valueKey: 存储目标值的键名,默认是'value',可以根据实际场景修改
示例1:两层嵌套转换
原始列表:
List list = [ [category: 'A', name: 'a', value: 10], [category: 'A', name: 'b', value: 20], [category: 'B', name: 'a', value: 30], [category: 'B', name: 'c', value: 40], [category: 'B', name: 'd', value: 50], ]
调用方法:
def resultMap = nest(list, ['category', 'name'])
转换结果:
[ A: [a: 10, b: 20], B: [a: 30, c: 40, d: 50] ]
示例2:四层嵌套转换
原始列表:
List list = [ [category: 'A', subcategory: 'I', group: 'x', name: 'a', value: 10], [category: 'A', subcategory: 'I', group: 'y', name: 'b', value: 20], ]
调用方法:
def resultMap = nest(list, ['category', 'subcategory', 'group', 'name'])
转换结果:
[ A: [I: [ x: [a: 10], y: [b: 20] ]] ]
这个实现的优势在于完全不需要根据嵌套层级修改核心逻辑,只需要调整keys参数的顺序和数量就能适配任意层级的转换需求,代码简洁易读,维护成本低。
内容的提问来源于stack exchange,提问作者piotrgajow
相关产品推荐
相关产品推荐

