Groovy:组列表和总计计算

Groovy:组列表和总计计算,groovy,Groovy,假设我有一个具有以下属性的对象列表 字符串名称,BigDecimal addThis,BigDecimal minus this 我需要做的是将列表按名称分组,然后使用下面的公式将addThis和减this组合起来: total = total + addThis total = total - minusThis 换句话说,如果addThis不为null,则应将该值添加到total中,如果minusThis不为null,则应将该值扣除到total中 预期输出应如下所示: [名称1:56.78

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

字符串名称,BigDecimal addThis,BigDecimal minus this

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

total = total + addThis
total = total - minusThis
换句话说,如果addThis不为null,则应将该值添加到total中,如果minusThis不为null,则应将该值扣除到total中

预期输出应如下所示: [名称1:56.789,名称2:6778.78,名称3:6767.788]

我将如何在Groovy中实现它

我知道我可以使用groupBy和collectEntries,但计算总数让我感到困惑。

选择使用groupBy和collectEntries是合适的。也需要注射

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]
选择使用groupBy和collectEntries是合适的。也需要注射

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]
我还将使用sum:

我还将使用sum: