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

Ray*_*Ray 101 groovy

让我说我有

def A = "abc"
def X = "xyz"
Run Code Online (Sandbox Code Playgroud)

我如何创建一个Mapwhere而不是

def map = [A:1, X:2]
Run Code Online (Sandbox Code Playgroud)

相反,我相当于写作

def map = [abc:1, xyz:2]
Run Code Online (Sandbox Code Playgroud)

但可以使用变量AX键?

PS:地图的价值部分也是同样的问题.

Joa*_*uer 154

用这个:

def map = [(A):1, (X):2]
Run Code Online (Sandbox Code Playgroud)

对于价值部分来说,它更容易,因为没有自动的"将文本转换为字符串"发生:

def map = [keyA:A, keyX:X]
Run Code Online (Sandbox Code Playgroud)

  • 只是提供一个参考:[Map Documentation](http://groovy.codehaus.org/JN1035-Maps)说:`要使用String的值作为地图的键值,只需用括号括起变量即可.` (10认同)
  • @mmigdol这句话来自[最新文档](http://groovy-lang.org)中的[旧的groovy文档](http://groovy.jmiguel.eu/groovy.codehaus.org/JN1035-Maps.html) /groovy-dev-kit.html#Collections-Maps)是这样的:`Map 键默认是字符串:[a:1] 相当于 ['a':1]。如果您定义一个名为 a 的变量并且希望其值成为映射中的键,这可能会令人困惑。如果是这种情况,那么您必须通过添加括号来转义>键..` (4认同)
  • @TriMix的区别在于Strings vs GStrings.使用`[(A):1,(X):2]`,变量将被转义为String.使用`["$ A":1,(X):2]`,"$ A"`是一个插值字符串,它产生一个GString.地图期望密钥是不可变的,GString不提供. (2认同)

Dón*_*nal 17

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

def map = [:]
def A = 'abc'
map[A] = 2
Run Code Online (Sandbox Code Playgroud)

如果您使用:

map.A = 2
Run Code Online (Sandbox Code Playgroud)

假设您要使用文字字符串"A"作为键(即使在作用域中有一个名为A的变量).

更新

正如@tim_yates在评论中指出的那样,如果您使用以下内容,也将解析一个关键变量:

map."$A" = 2
Run Code Online (Sandbox Code Playgroud)

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

  • `map."$ A"`语法为你提供了使用`map?'进行null安全地图导航的好处.$ A"`,使用`map [A​​]`语法无法实现的AFAIK (6认同)