Ich hätte gerne eine Abkürzung dafür:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
Angesichts der Art und Weise, wie das GDK-Zeug ist, würde ich erwarten, in der Lage zu sein, etwas zu tun wie:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
aber ich habe nichts in den Dokumenten gesehen ... vermisse ich etwas? oder bin ich einfach viel zu faul
Antworten:
Ich bin kürzlich auf die Notwendigkeit gestoßen, genau das zu tun: eine Liste in eine Karte umzuwandeln. Diese Frage wurde gestellt, bevor Groovy Version 1.7.9 herauskam, daher existierte die Methode
collectEntries
noch nicht. Es funktioniert genau wie die vorgeschlagenecollectMap
Methode :Wenn Sie aus irgendeinem Grund mit einer älteren Groovy-Version nicht weiterkommen, kann die
inject
Methode auch verwendet werden (wie hier vorgeschlagen ). Dies ist eine leicht modifizierte Version, die nur einen Ausdruck innerhalb des Verschlusses enthält (nur zum Speichern von Zeichen!):Der
+
Operator kann auch anstelle von verwendet werden<<
.quelle
Überprüfen Sie "injizieren". Echte funktionale Programmier-Wonks nennen es "Fold".
Und wenn Sie schon dabei sind, möchten Sie Methoden wahrscheinlich als Kategorien definieren, anstatt direkt in der MetaClass. Auf diese Weise können Sie es einmal für alle Sammlungen definieren:
Anwendungsbeispiel:
quelle
War die groupBy- Methode nicht verfügbar, als diese Frage gestellt wurde?
quelle
Map<K, List<V>>
Es scheint, dass das OP nach einer Methode mit dem Rückgabetyp suchtMap<K, V>
, sodass groupBy in diesem Fall nicht funktioniert.Wenn Sie ein einfaches Schlüssel-Wert-Paar benötigen, sollte die Methode
collectEntries
ausreichen. BeispielsweiseWenn Sie jedoch eine Struktur ähnlich einer Multimap wünschen, in der es mehrere Werte pro Schlüssel gibt, möchten Sie die
groupBy
Methode verwendenquelle
Wenn Sie Google-Sammlungen verwenden ( http://code.google.com/p/google-collections/ ), können Sie Folgendes tun:
quelle
ok ... ich habe ein bisschen mehr damit gespielt und ich denke das ist eine ziemlich coole Methode ...
Jetzt hat jede Unterklasse von Map oder Collection diese Methode ...
hier verwende ich es, um den Schlüssel / Wert in einer Karte umzukehren
und hier benutze ich es, um eine Karte aus einer Liste zu erstellen
Jetzt füge ich dies einfach in eine Klasse ein, die aufgerufen wird, während meine App startet, und diese Methode ist in meinem gesamten Code verfügbar.
BEARBEITEN:
um die Methode allen Arrays hinzuzufügen ...
quelle
Ich kann nichts Eingebautes finden ... aber mit der ExpandoMetaClass kann ich Folgendes tun:
Dadurch wird die Methode collectMap zu allen ArrayLists hinzugefügt. Ich bin mir nicht sicher, warum das Hinzufügen zu List oder Collection nicht funktioniert hat. Ich denke, das ist eine andere Frage. Aber jetzt kann ich das tun.
Von der Liste zur berechneten Karte mit einem Abschluss ... genau das, wonach ich gesucht habe.
Bearbeiten: Der Grund, warum ich die Methode nicht zu den Schnittstellen Liste und Sammlung hinzufügen konnte, war, dass ich dies nicht getan habe:
Nach diesem Methodenaufruf können Sie Schnittstellen Methoden hinzufügen. In diesem Fall bedeutet dies, dass meine collectMap-Methode für Bereiche wie diesen funktioniert:
was die Karte ergibt: [0: 0, 1: 2, 2: 4]
quelle
Was ist mit so etwas?
quelle