2

例如,如果地图等于:

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

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

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

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

谢谢

4

1 回答 1

5

有一个collectEntries函数,它应用于 a 中的所有键和值Map,并返回一个带有更新值的新函数: Map

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

这里有几点注意事项:

  • 首先,你不需要在 map 字面量中引用字符串键,含义['z':1]与 相同[z:1],但后者更 groovier 和更易读
  • 其次,collectEntries闭包的返回值必须是一个map,所以要小心那里
  • 第三,在map中提供动态键时,需要用括号括起来,所以需要使用(key),而不仅仅是key
  • 第四,您需要分配方法的结果,它不会就地执行。

但是,几乎可以肯定,each()与单参数闭包一起使用会更干净,如下所示:

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

这种方式的问题较少,并且它会就地修改地图,因此您不必重新分配变量。

于 2013-02-04T03:15:46.690 回答