在Groovy中,如何在地图中添加某个属性的值?

时间:2012-08-14 04:39:16

标签: groovy

我有以下地图:

def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])

我想得到地图中所有count属性的总和。在使用LINQ的C#中,它将类似于:

map.Sum(x => x.count)

如何在Groovy中执行相同操作?

3 个答案:

答案 0 :(得分:20)

假设您有一个这样的列表:

List list = [ [item: "foo", count: 5],
              [item: "bar", count: 3] ]

然后有多种方法可以做到这一点。最可读的可能是

int a = list.count.sum()

或者你可以在整个列表中使用Closure形式的总和

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 )

我会使用第一个。

答案 1 :(得分:1)

首先,您在示例中混淆了地图和列表语法。无论如何,Groovy为所有集合注入.sum(closure)方法。

示例:

[[a:1,b:2], [a:5,b:4]].sum { it.a }
===> 6

答案 2 :(得分:0)

您想使用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}"