Maps 每个键只能有一个条目。
不过,您可以拥有地图的值列表,例如 [ key:[ val1, val2 ] ]。
如果您的原始数据在地图列表中,也许groupBy 会有所帮助?即:
def data = [ [ name:'a', value:1 ],
[ name:'b', value:1 ],
[ name:'a', value:1 ] ]
def result = data.groupBy { it.name }
assert result == [ a:[ [ name:'a', value:1 ],
[ name:'a', value:1 ] ],
b:[ [ name:'b', value:1 ] ] ]
assert result.a == [ [ name:'a', value:1 ], [ name:'a', value:1 ] ]
使用您的示例,您可以:
def list = [ [ name1:'a', name2:'b', name3:'c', name4:'d', other:1, other1:2 ],
[ name1:'a', name2:'a', name3:'b', name4:'c', other:3, other1:4],
[ name1:'a', name2:'b', name3:'c', name4:'d', other:2, other1:3] ]
list.groupBy { [ name1:it.name1, name2:it.name2, name3:it.name3, name4:it.name4 ] }.collectEntries { k, v ->
[ k, v.collect { [ other:it.other, other1:it.other1 ] } ]
}
这会给你输出地图:
[ ['name1':'a', 'name2':'b', 'name3':'c', 'name4':'d']:[['other':1, 'other1':2], ['other':2, 'other1':3]],
['name1':'a', 'name2':'a', 'name3':'b', 'name4':'c']:[['other':3, 'other1':4]]]
你的意思是这样的?
编辑
不使用collectEntries,这可能有效:
list.groupBy { [ name1:it.name1, name2:it.name2, name3:it.name3, name4:it.name4 ] }
.inject( [:] ) { map, key, value ->
map[ key ] = value.collect { [ other:it.other, other1:it.other1 ] }
map
}