如何将变量用于地图的关键部分


109

假设我有

def A = "abc"
def X = "xyz"

我如何创建一个Map地方,而不是

def map = [A:1, X:2]

我得到的相当于写作

def map = [abc:1, xyz:2]

但是可以使用变量AX键吗?

PS:关于地图价值部分的相同问题。

Answers:


168

用这个:

def map = [(A):1, (X):2]

对于价值部分,它甚至更容易,因为没有自动的“将文本转换为字符串”的情况发生:

def map = [keyA:A, keyX:X]

11
To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
仅供

1
@mmigdol,此引用来自最新文档中的旧groovy文档,如下所示: Map keys are strings by default: [a:1] is equivalent to ['a':1]. This can be confusing if you define a variable named a and that you want the value of to be the key in your map. If this is the case, then you must escape >the key by adding parenthesis..
Michal Bernhard

那么def map = [(A):1,(X):2]之间的差异是什么。和def map = [“ $ A”:1,(X):2](如果有)?
TriMix

2
@TriMix的区别是Strings vs GStrings。使用[(A):1, (X):2],变量将被转义为字符串。使用["$A":1, (X):2]"$A"是插补字符串,产生GString。地图期望键是GString不提供的不可变的。
乔什·里昂

20

除了Joachim的答案,如果您想向现有地图添加条目并且键是变量,请使用:

def map = [:]
def A = 'abc'
map[A] = 2

如果您使用:

map.A = 2

假定您要使用文字字符串“ A”作为键(即使作用域中有一个名为A的变量也是如此)。

更新资料

正如@tim_yates在评论中指出的那样,如果您使用以下命令,还将解析键变量:

map."$A" = 2

尽管我个人更喜欢使用[A]语法,因为"$A"如果重命名变量,重构工具可能会丢失引用


6
map."$A"语法给你空安全地图导航与效益map?."$A",这AFAIK您可以使用无法实现map[A]的语法
Ghiro酒店
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.