Groovy groupBy基于多个属性并仅提取值

Groovy groupBy基于多个属性并仅提取值,groovy,Groovy,具有元素列表: 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], ] 我想将其转换为嵌套贴图: M

具有元素列表:

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],
]
我想将其转换为嵌套贴图:

Map map = [
    A: [a: 10, b: 20],
    B: [a: 30, c: 40, d: 50],
]
我提出的唯一解决方案是这样做:

list.groupBy(
    { it.category }, { it.name }
).collectEntries { category, names ->
    [(category): names.collectEntries { name, values ->
        [(name): values.value[0]]
    }]
}
然而,我将不得不在未来处理超过2个级别的嵌套,而这种方法将是不可行的

在Groovy中有没有更灵活的方法来获得正确的结果

编辑:

超过2级嵌套指的是转换结构,如:

List list =  [
    [category: 'A', subcategory: 'I', group: 'x', name: 'a', value: 10],
    [category: 'A', subcategory: 'I', group: 'y', name: 'b', value: 20],
]
进入:


通过添加嵌套(深度),它将需要更多嵌套的
collectEntries
调用,这些调用将变得不可读。

我通过使用
Map
和default
方法以及递归的
Closure
调用,找到了一个巧妙的解决方案:

Map map = { [:].withDefault { owner.call() } }.call()
list.each {
    map[it.category][it.name] = it.value
}
或第二种情况:

Map map = { [:].withDefault { owner.call() } }.call()
list.each {
    map[it.category][it.subcategory][it.group][it.name] = it.value
}

你能举一个例子说明你的数据在多层嵌套中的样子吗?不清楚您是否有嵌套的值需要进入顶级类别,或者您的结果是否需要嵌套,或者其他什么。
Map map = { [:].withDefault { owner.call() } }.call()
list.each {
    map[it.category][it.subcategory][it.group][it.name] = it.value
}