如何在Groovy中通过因子多个所有地图值?

时间:2013-02-04 00:42:01

标签: groovy

例如,如果地图等于:

z = ['x':1, 'y':2]

对于f(2)我希望它成为:

[x':2, 'y':4]

我知道可以使用.each循环完成,问题是是否有更简单的方法。

谢谢

1 个答案:

答案 0 :(得分:5)

collectEntries函数适用于Map中的所有键和值,并返回带有更新值的 new Map:< / p>

def z = [x:1, y:2]
z = z.collectEntries{ key, value -> [(key): value*2] }
assert z == [x:2, y:4]

这里有几点说明:

  • 首先,您不需要在地图文字中引用字符串键,这意味着['z':1][z:1]相同,但后者更加流畅且更易读
  • 其次,collectEntries闭包的返回值必须是地图,所以要小心
  • 第三,在地图中提供动态键时,需要将它们括在括号中,因此您需要使用(key),而不仅仅是key
  • 第四,你需要分配方法的结果,它不会就地行动。

但是,将each()与单参数闭包一起使用几乎肯定更清晰,如下所示:

def z = [x:1, y:2]
z.each{ it.value = it.value*2 }
assert z == [x:2, y:4]

这种方式更少,并且它会就地修改地图,因此您无需重新分配变量。