Cómo utilizar una variable para la parte clave de un mapa

109

Digamos que tengo

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

¿Cómo creo un Mapdónde, en lugar de

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

Obtengo en cambio el equivalente a escribir

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

pero ¿se pueden utilizar variables Ay Xpara la clave?

PD: La misma pregunta para la parte de valor del mapa.

Rayo
fuente

Respuestas:

168

Utilizar este:

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

Para la parte de valor, es aún más fácil, ya que no se produce una conversión automática de texto a cadena:

def map = [keyA:A, keyX:X]
Joachim Sauer
fuente
11
Solo para proporcionar una referencia: la documentación del mapa dice:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol
1
@mmigdol esta cita es de documentación antigua y maravillosa en la documentación más reciente, es así: 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
Entonces, ¿cuál es la diferencia entre def map = [(A): 1, (X): 2]. y def map = ["$ A": 1, (X): 2] si hay alguno?
TriMix
2
@TriMix la diferencia es Strings vs GStrings. Con [(A):1, (X):2], la variable se escapa a una cadena. Con ["$A":1, (X):2], "$A"es una cadena interpolada que da como resultado una GString. Los mapas esperan que las claves sean inmutables, lo que no proporciona un GString.
Josh Lyon
20

Además de la respuesta de Joachim , si desea agregar entradas a un mapa existente y las claves son variables, use:

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

Si utiliza:

map.A = 2

Se supone que desea utilizar la cadena literal 'A' como clave (aunque hay una variable denominada A en el alcance.

Actualizar

Como @tim_yates señaló en un comentario, una variable clave también se resolverá si usa:

map."$A" = 2

aunque personalmente prefiero usar la [A]sintaxis porque las herramientas de refactorización pueden perder la "$A"referencia si se cambia el nombre de la variable

Dónal
fuente
6
la map."$A"sintaxis le brinda el beneficio de una navegación de mapa segura y nula con map?."$A", que AFAIK no puede lograr usando la map[A]sintaxis
Ghiro