Groovy中Map嵌套分组问题:按公共值分组生成嵌套结构
Groovy嵌套Map分组解决方案
输入数据
def input = [ [user: 'andy', name: 'Andrew', role: 'dev', roleDesc: 'Developer'], [user: 'andy', name: 'Andrew', role: 'sup', roleDesc: 'Supervisor'], [user: 'pat', name: 'Patricia', role: 'man', roleDesc: 'Manager'], [user: 'pat', name: 'Patricia', role: 'sup', roleDesc: 'Supervisor'] ]
期望输出
[ [user: 'andy', name: 'Andrew', roles: [[role: 'dev', roleDesc: 'Developer'], [role: 'sup', roleDesc: 'Supervisor']]], [user: 'pat', name: 'Patricia', roles: [[role: 'man', roleDesc: 'Manager'], [role: 'sup', roleDesc: 'Supervisor']]] ]
正确实现代码
def result = input.groupBy { [it.user, it.name] }.collect { key, entries -> [ user: key[0], name: key[1], roles: entries.collect { [role: it.role, roleDesc: it.roleDesc] } ] } // 打印结果验证 println(result)
代码说明
- groupBy分组:用
[it.user, it.name]作为分组键,将相同user和name的条目归为同一组 - collect转换结构:遍历每个分组,提取分组键中的user和name,再将分组内的每个条目单独取出
role和roleDesc组成新Map,最后把这些新Map收集为roles列表 - 此方式避免了之前的键值合并错误,因为每个条目都独立生成包含role和roleDesc的Map,而非将同键值合并成单一列表
内容的提问来源于stack exchange,提问作者Dan V
相关产品推荐
相关产品推荐

