假设我有一个具有以下属性的对象列表
字符串名称,BigDecimal addThis,BigDecimal minusThis
我需要做的是将列表按名称分组,然后使用下面的公式组合addThis并减去它:
total = total + addThis
total = total - minusThis换句话说,如果addThis为非空值,则应将该值添加到总和中,如果minusThis为非空值,则应将该值减去总数。
预期的输出应该如下所示: name1:56.789,name2:6778.78,name3:676767.788
我将如何在Groovy中做到这一点?
我知道我可以使用groupBy和collectEntries,但是计算总数使我感到困惑。
发布于 2016-06-06 23:30:42
我也会使用sum()
list.groupBy { it.name }
.collectEntries {
[(it.key): it.value.sum { (it.addThis ?: 0) - (it.minusThis ?: 0) }]
}发布于 2016-06-06 14:51:34
选择使用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]https://stackoverflow.com/questions/37654859
复制相似问题