我有以下地图:
def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])
我想得到count
地图中所有属性的总和。在使用 LINQ 的 C# 中,它将类似于:
map.Sum(x => x.count)
我如何在 Groovy 中做同样的事情?
我有以下地图:
def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])
我想得到count
地图中所有属性的总和。在使用 LINQ 的 C# 中,它将类似于:
map.Sum(x => x.count)
我如何在 Groovy 中做同样的事情?
假设你有一个这样的列表:
List list = [ [item: "foo", count: 5],
[item: "bar", count: 3] ]
然后有多种方法可以做到这一点。最易读的可能是
int a = list.count.sum()
或者您可以在整个列表中使用 sum 的闭包形式
int b = list.sum { it.count }
或者您甚至可以使用更复杂的路线,例如注入
int c = list.count.inject { tot, ele -> tot + ele } // Groovy 2.0
// c = list.count.inject( 0 ) { tot, ele -> tot + ele } // Groovy < 2.0
所有这些都给出相同的结果。
assert ( a == b ) && ( b == c ) && ( c == 8 )
我会用第一个。
您想使用collect
运算符。我用 groovysh 检查了以下代码:
list1 = []
total = 0
list1[0] = [item: "foo", count: 5]
list1[1] = [item: "bar", count: 3]
list1.collect{ total += it.count }
println "total = ${total}"
首先,您在示例中混淆了 map 和 list 语法。总之,Groovy 向所有集合注入了一个.sum(closure)方法。
例子:
[[a:1,b:2], [a:5,b:4]].sum { it.a }
===> 6