我想在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}
答案 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 }