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

Krz*_*zyk 8 groovy

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

def m = [:]
m['a'] = 1
m['b'] = 2
m['d'] = 3
m.findAll { it.value > 1}.each { 
it.value = 4
}
println m
Run Code Online (Sandbox Code Playgroud)

但结果如下:

[a:1, b:2, d:3]
Run Code Online (Sandbox Code Playgroud)

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

m.each {if (it.value>1) it.value=4}
Run Code Online (Sandbox Code Playgroud)

卢声远*_* Lu 11

根本原因是findAll返回一个新的Map实例.

所以你可以尝试:

newMap = m.findAll { it.value > 1}.each { 
    it.value = 4
}
println m      //No change
println newMap //This is what you need!
Run Code Online (Sandbox Code Playgroud)

输出是

[a:1, b:2, d:3] 
[b:4, d:4]
Run Code Online (Sandbox Code Playgroud)


Mik*_*ark 5

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

m.findAll { it.value > 1 }.each { m[it.key] = 4 }
Run Code Online (Sandbox Code Playgroud)