Me gustaría tener una mano amiga para esto:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
dada la forma en que están las cosas de GDK, esperaría poder hacer algo como:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
pero no he visto nada en los documentos ... ¿me falta algo? ¿O soy demasiado vago?
Respuestas:
Recientemente me encontré con la necesidad de hacer exactamente eso: convertir una lista en un mapa. Esta pregunta se publicó antes de que saliera la versión 1.7.9 de Groovy, por lo que el método
collectEntries
aún no existía. Funciona exactamente como elcollectMap
método propuesto :Si por alguna razón está atascado con una versión anterior de Groovy, el
inject
método también se puede utilizar (como se propone aquí ). Esta es una versión ligeramente modificada que solo toma una expresión dentro del cierre (¡solo para guardar el carácter!):El
+
operador también se puede utilizar en lugar de<<
.fuente
Echa un vistazo a "inyectar". Los verdaderos expertos en programación funcional lo llaman "pliegue".
Y, mientras lo hace, probablemente desee definir métodos como Categorías en lugar de directamente en la metaclase. De esa manera, puede definirlo una vez para todas las colecciones:
Uso de ejemplo:
fuente
¿ El método groupBy no estaba disponible cuando se hizo esta pregunta?
fuente
Map<K, List<V>>
Parece que el OP está buscando un método con tipo de retornoMap<K, V>
, por lo que groupBy no funciona en este caso.Si lo que necesita es un par clave-valor simple, entonces el método
collectEntries
debería ser suficiente. Por ejemploPero si desea una estructura similar a un Multimap, en el que hay varios valores por clave, entonces querrá usar el
groupBy
métodofuente
Además, si usa colecciones de Google ( http://code.google.com/p/google-collections/ ), puede hacer algo como esto:
fuente
ok ... he jugado con esto un poco más y creo que este es un método bastante bueno ...
ahora cualquier subclase de Mapa o Colección tiene este método ...
aquí lo uso para revertir la clave / valor en un mapa
y aquí lo uso para crear un mapa a partir de una lista
ahora simplemente pongo esto en una clase que se llama cuando mi aplicación se está iniciando y este método está disponible en todo mi código.
EDITAR:
para agregar el método a todas las matrices ...
fuente
No puedo encontrar nada integrado ... pero usando ExpandoMetaClass puedo hacer esto:
esto agrega el método collectMap a todas las ArrayLists ... No estoy seguro de por qué agregarlo a List o Collection no funcionó ... Supongo que eso es para otra pregunta ... pero ahora puedo hacer esto ...
de la lista al mapa calculado con un cierre ... exactamente lo que estaba buscando.
Editar: la razón por la que no pude agregar el método a la Lista y Colección de interfaces fue porque no hice esto:
después de esa llamada al método, puede agregar métodos a las interfaces ... lo que en este caso significa que mi método collectMap funcionará en rangos como este:
que produce el mapa: [0: 0, 1: 2, 2: 4]
fuente
¿Y algo como esto?
fuente