Groovy:总计的组列表和计算

时间:2016-06-06 10:16:33

标签: groovy

假设我有一个具有以下属性的对象列表

  

字符串名称,BigDecimal addThis,BigDecimal minusThis

我需要做的是按名称对列表进行分组,然后使用下面的公式将addThis和minus结合起来:

total = total + addThis
total = total - minusThis

换句话说,如果addThis不为null,则应将该值添加到total中,如果为minus这不为null,则该值应扣除为total。

预期输出应该是这样的: [name1:56.789,name2:6778.78,name3:676767.788]

我将如何在Groovy中执行此操作?

我知道我可以使用groupBycollectEntries,但计算总让我困惑。

2 个答案:

答案 0 :(得分:3)

我也会使用sum()

list.groupBy { it.name }
    .collectEntries {
        [(it.key): it.value.sum { (it.addThis ?: 0) - (it.minusThis ?: 0) }]
    }

答案 1 :(得分:2)

选择使用groupBycollectEntries是合适的。还需要inject

def list = [
    [name: 'foo', addThis:1, minusThat:3], 
    [name: 'foo', addThis:5, minusThat:2], 
    [name: 'bar', addThis:6, minusThat:8],
    [name: 'baz', addThis:9, minusThat:5]    
]

assert list.groupBy { it.name }.collectEntries { key, values ->
    [ 
        key, 
        values.inject(0) { total, next -> 
            total += (next.addThis ?: 0) - (next.minusThat ?: 0)
        } 
    ]
} == [foo:1, bar:-2, baz:4]