在Groovy中合并和汇总数据

Dea*_*Iss 1 groovy group-by aggregate sum

我想知道汇总数据的最佳方法是在Groovy中吗?

可以说我有以下数据:

[
   [id: 1, name: bob, age:20, numberOfPackages: 10, numberOfPurchases:20 ],
   [id: 1, name: bob, age:20, numberOfPackages: 5, numberOfPurchases:6 ],
   [id: 2, name: Rob, age:22, numberOfPackages: 3, numberOfPurchases:5 ],
]
Run Code Online (Sandbox Code Playgroud)

我想将它转化为以下(合并ID / 姓名 / 年龄,但和价格 / 数量每购买ID):

[
   [id: 1, name: bob, age:20, numberOfPackages: 15, numberOfPurchases:26 ],
   [id: 2, name: Rob, age:22, numberOfPackages: 3, numberOfPurchases:5 ],
]
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 5

汇总价格和分别购买的数量没有什么意义,您的意思是:

def data = [
    [id: 1, name: 'bob', age:20, price: 10, numberOfPurchases:20],
    [id: 1, name: 'bob', age:20, price:  5, numberOfPurchases:6],
    [id: 2, name: 'rob', age:22, price:  3, numberOfPurchases:5]
]

data.groupBy { [id:it.id, name:it.name, age:it.age] }.collect { k, v ->
    [id:k.id,
     name:k.name,
     age:k.age,
     spend:v.collect { it.price * it.numberOfPurchases }.sum()]
}
Run Code Online (Sandbox Code Playgroud)

这使:

[
    [id:1, name:'bob', age:20, spend:230],
    [id:2, name:'rob', age:22, spend:15]
]
Run Code Online (Sandbox Code Playgroud)