J'aimerais une sorte de main pour ceci:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
étant donné la façon dont les choses GDK sont, je m'attendrais à être capable de faire quelque chose comme:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
mais je n'ai rien vu dans la documentation ... est-ce que je manque quelque chose? ou suis-je juste trop paresseux?
Réponses:
J'ai récemment découvert la nécessité de faire exactement cela: convertir une liste en carte. Cette question a été postée avant la sortie de la version 1.7.9 de Groovy, donc la méthode
collectEntries
n'existait pas encore. Cela fonctionne exactement comme lacollectMap
méthode qui a été proposée :Si pour une raison quelconque vous êtes coincé avec une ancienne version de Groovy, la
inject
méthode peut également être utilisée (comme proposé ici ). Il s'agit d'une version légèrement modifiée qui ne prend qu'une seule expression à l'intérieur de la fermeture (juste pour sauver des caractères!):L'
+
opérateur peut également être utilisé à la place de<<
.la source
Découvrez "injecter". Les vrais imbéciles de la programmation fonctionnelle l'appellent «pli».
Et, pendant que vous y êtes, vous voudrez probablement définir des méthodes en tant que catégories au lieu de directement sur la métaClasse. De cette façon, vous pouvez le définir une fois pour toutes les collections:
Exemple d'utilisation:
la source
La méthode groupBy n'était- elle pas disponible lorsque cette question a été posée?
la source
Map<K, List<V>>
Il semble que l'OP recherche une méthode avec un type de retourMap<K, V>
, donc groupBy ne fonctionne pas dans ce cas.Si vous avez besoin d'une simple paire clé-valeur, la méthode
collectEntries
devrait suffire. Par exempleMais si vous voulez une structure similaire à une Multimap, dans laquelle il y a plusieurs valeurs par clé, vous voudrez alors utiliser la
groupBy
méthodela source
De plus, si vous utilisez des collections google ( http://code.google.com/p/google-collections/ ), vous pouvez faire quelque chose comme ceci:
la source
ok ... j'ai joué avec ça un peu plus et je pense que c'est une méthode plutôt cool ...
maintenant, toutes les sous-classes de Map ou Collection ont cette méthode ...
ici je l'utilise pour inverser la clé / valeur dans une carte
et ici je l'utilise pour créer une carte à partir d'une liste
maintenant, je saisis simplement ceci dans une classe qui est appelée lorsque mon application démarre et cette méthode est disponible dans tout mon code.
ÉDITER:
pour ajouter la méthode à tous les tableaux ...
la source
Je ne trouve rien de intégré ... mais en utilisant ExpandoMetaClass, je peux le faire:
cela ajoute la méthode collectMap à tous les ArrayLists ... Je ne sais pas pourquoi l'ajout à List ou Collection n'a pas fonctionné ... Je suppose que c'est pour une autre question ... mais maintenant je peux le faire ...
de la liste à la carte calculée avec une fermeture ... exactement ce que je cherchais.
Edit: la raison pour laquelle je n'ai pas pu ajouter la méthode à la liste des interfaces et à la collection était parce que je ne l'ai pas fait:
après cet appel de méthode, vous pouvez ajouter des méthodes aux interfaces .. ce qui dans ce cas signifie que ma méthode collectMap fonctionnera sur des plages comme celle-ci:
ce qui donne la carte: [0: 0, 1: 2, 2: 4]
la source
Et quelque chose comme ça?
la source