我有一个 list 如下

    ordersList=[[id:1, amount:1000, salesPerson:'XYZ'],
                [id:2, amount:3000, salesPerson:'XYZ'],
                [id:3, amount:1000, salesPerson:'ABC']
                 ...n items

               ];

我想收集具有相同属性'salesPerson'的值和该'salesPerson'的所有订单金额的总和的项目,最后我想要具有如下列表,这意味着应该为每个'salesPerson'创建一个列表,并且应该包含所有带有“salesPerson”的订单

最后,我期望的 list 是
 salesPersonOrdersList = [xyzSalesPersonOrdersList, abcSalesPersonOrdersList]


    xyzSalesPersonOrdersList = [[name:'XYZ'], orders:[[id:1, amount:1000],[id:2, amount:3000]],[totalAmount:4000] ]

    abcSalesPersonOrdersList = [[name:'ABC'], orders:[[id:3, amount:1000]],[totalAmount:1000] ]

这该怎么做。

最佳答案

使用groupBy按名称对项目进行分组:

def ordersList=[[id:1, amount:1000, salesPerson:'XYZ'],
            [id:2, amount:3000, salesPerson:'XYZ'],
            [id:3, amount:1000, salesPerson:'ABC']
           ];

ordersList.groupBy{it.salesPerson}
//------------------------------------------------
//Result: [XYZ:[[id:1, amount:1000, salesPerson:XYZ], [id:2, amount:3000, salesPerson:XYZ]], ABC:[[id:3, amount:1000, salesPerson:ABC]]]

然后,您可以根据需要转换 map ,例如:
ordersList.groupBy{it.salesPerson}.collect{[name : it.key,orders : it.value]}
//-----------------------------------------------
//Result: [[name:XYZ, orders:[[id:1, amount:1000, salesPerson:XYZ], [id:2, amount:3000, salesPerson:XYZ]]], [name:ABC, orders:[[id:3, amount:1000, salesPerson:ABC]]]]

07-26 00:36