102 votes

raccourci pour créer une carte d’une liste dans groovy ?

Je voudrais quelque sorthand pour cela :

compte tenu de la façon dont les choses GDK sont, je m’attends à être en mesure de faire quelque chose comme :

mais je n’ai rien vu dans les docs... ai-je raté quelque chose ? ou suis-je tout simplement trop paresseux ?

113voto

epidemian Points 10113

J'ai récemment tombé sur la nécessité de faire exactement cela: la conversion d'une liste sur une carte. Cette question a été posté avant Groovy version 1.7.9 est sorti, de sorte que la méthode de collectEntries n'existent pas encore. Il fonctionne exactement comme l' collectMap méthode qui a été proposée:

Map rowToMap(row) {
    row.columns.collectEntries{[it.name, it.val]}
}

Si pour quelque raison vous êtes coincé avec une ancienne version Groovy, l' inject méthode peut également être utilisé (comme proposé ici). C'est une version légèrement modifiée qui ne prend qu'une expression à l'intérieur de la fermeture (juste pour le plaisir de caractère salvateur!):

Map rowToMap(row) {
    row.columns.inject([:]) {map, col -> map << [(col.name): col.val]}
}

L' + opérateur peut également être utilisé à la place de l' <<.

28voto

Robert Fischer Points 869

Découvrez « d’injecter ». Les mordus de programmation fonctionnelles réelle l’appellent « pli ».

Et, pendant que vous y êtes, vous voudrez probablement définir des méthodes comme des catégories au lieu de droite sur la métaclasse. De cette façon, vous pouvez la définir une fois pour toutes les Collections :

Exemple d’utilisation :

13voto

Amir Raminfar Points 17939

Était la méthode groupBy pas disponible lorsque cette question a été posée ?

5voto

ogrodnek Points 146

En outre, si vous êtes utilisez google collections (http://code.google.com/p/google-collections/), vous pouvez faire quelque chose comme ceci :

5voto

danb Points 3688

ok... j'ai joué avec ce un peu plus et je pense que c'est une super méthode...

def collectMap = {Closure callback->
    def map = [:]
    delegate.each {
        def r = callback.call(it)
        map[r[0]] = r[1]
    }
    return map
}
ExpandoMetaClass.enableGlobally()
Collection.metaClass.collectMap = collectMap
Map.metaClass.collectMap = collectMap

maintenant, toute sous-classe de la Carte ou de la Collection de cette méthode...

ici, je l'utilise pour inverser la clé/valeur dans une Carte

[1:2, 3:4].collectMap{[it.value, it.key]} == [2:1, 4:3]

et ici, je l'utilise pour créer une carte à partir d'une liste

[1,2].collectMap{[it,it]} == [1:1, 2:2]

maintenant, j'ai juste pop ce dans une classe qui est appelée que mon application est de commencer et cette méthode est disponible tout au long de mon code.

EDIT:

pour ajouter une méthode à tous les tableaux...

Object[].metaClass.collectMap = collectMap

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X