使用findAll更新地图,每个都在groovy中

时间:2013-12-09 21:18:43

标签: groovy

我想在Groovy中更新地图中的值以填充某些条件。这是我的代码:

def m = [:]
m['a'] = 1
m['b'] = 2
m['d'] = 3
m.findAll { it.value > 1}.each { 
it.value = 4
}
println m

但结果如下:

[a:1, b:2, d:3]

有没有办法同时使用findAll和each?或者我必须使用

m.each {if (it.value>1) it.value=4}

2 个答案:

答案 0 :(得分:11)

根本原因是findAll返回新地图实例

所以你可以试试:

newMap = m.findAll { it.value > 1}.each { 
    it.value = 4
}
println m      //No change
println newMap //This is what you need!

输出

[a:1, b:2, d:3] 
[b:4, d:4]

答案 1 :(得分:4)

在每种情况下,使用each迭代的值都是带有指向键和值的指针的映射条目。当您设置it.value时,您没有替换地图中的内容。您只是更新映射条目中的指针。要实际设置该值,您需要执行以下操作:

m.findAll { it.value > 1 }.each { m[it.key] = 4 }