Groovy:组列表和总计计算
假设我有一个具有以下属性的对象列表 字符串名称,BigDecimal addThis,BigDecimal minus this 我需要做的是将列表按名称分组,然后使用下面的公式将addThis和减this组合起来: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
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: