假设我有一个具有以下属性的对象列表
字符串名称,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中执行此操作?
我知道我可以使用groupBy
和collectEntries
,但计算总让我困惑。
答案 0 :(得分:3)
我也会使用sum()
:
list.groupBy { it.name }
.collectEntries {
[(it.key): it.value.sum { (it.addThis ?: 0) - (it.minusThis ?: 0) }]
}
答案 1 :(得分:2)
选择使用groupBy
和collectEntries
是合适的。还需要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]