如何在映射表中使用变量作为键值部分

137

假设我拥有以下内容:

def A = "abc"
def X = "xyz"
如何创建一个Map,其中,除了
def map = [A:1, X:2]

我得到的是写作等效的结果

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

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

附:对于映射的值部分,同样的问题。

2个回答

220
请使用以下代码:
def map = [(A):1, (X):2]

对于值的部分,更容易一些,因为没有自动将文本转换为字符串的魔法发生:

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

20
仅供参考:Map Documentation 中提到:“若要使用字符串的值作为地图键值,请在变量周围加上括号。” - mmigdol
4
@mmigdol 这个引用来自于旧版Groovy文档,在最新的文档中是这样写的: 默认情况下,Map键为字符串:[a:1]等同于['a':1]。如果你定义了一个名为a的变量,并且你想要它的值作为映射中的键,这可能会让人感到困惑。如果是这种情况,则必须通过添加括号来转义键。 - Michal Bernhard
那么,def map = [(A):1, (X):2] 和 def map = ["$A":1, (X):2] 有什么区别呢? - TriMix
3
@TriMix,区别在于Strings和GStrings。使用[(A):1, (X):2]时,变量被转义为字符串。而使用["$A":1, (X):2]时,"$A"是一个插值字符串,结果为GString。Map期望键是不可变的,而GString无法提供这一点。 - Josh Lyon

28

参考Joachim 的回答,如果您想要向现有地图添加条目,并且键是变量,请使用:

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

如果您使用:

map.A = 2

假设你想使用字面字符串'A'作为键(尽管在作用域中有名为A的变量)。

更新

正如@tim_yates在评论中指出的那样,如果你使用以下方式,键变量也将被解析:

map."$A" = 2

虽然我个人更喜欢使用[A]语法,因为重构工具可能会错过对变量重命名后"$A"的引用。


9
map."$A"语法使您可以通过map?."$A"实现空安全的地图导航,而使用map[A]语法是无法做到这一点的。 - Ghiro
"map"是什么意思?当map为null时,"$A" = 2是什么意思?这很有趣吗? - Lee Meador
map["$A"] 可以使用。 - Barel elbaz
map."$A" = 2 在 Jenkins 流水线中运行良好。 map.A 不起作用。 - Dziki_Jam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接