Chciałbym na to trochę odpocząć:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
biorąc pod uwagę stan rzeczy z GDK, spodziewałbym się, że będę w stanie zrobić coś takiego:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
ale nie widziałem nic w dokumentach ... czy coś mi brakuje? czy jestem po prostu zbyt leniwy?
Odpowiedzi:
Niedawno natknąłem się na potrzebę zrobienia dokładnie tego: przekonwertowania listy na mapę. To pytanie zostało wysłane przed pojawieniem się Groovy w wersji 1.7.9, więc metoda
collectEntries
jeszcze nie istniała. Działa dokładnie tak, jak zaproponowanacollectMap
metoda :Jeśli z jakiegoś powodu utkniesz ze starszą wersją Groovy,
inject
możesz również użyć metody (jak zaproponowano tutaj ). To jest nieco zmodyfikowana wersja, która przyjmuje tylko jedno wyrażenie wewnątrz zamknięcia (tylko ze względu na zapisywanie znaków!):+
Operator może również być stosowany zamiast<<
.źródło
Sprawdź "wstrzyknąć". Prawdziwi fani programowania funkcjonalnego nazywają to „pasowaniem”.
A skoro już to robisz, prawdopodobnie chcesz zdefiniować metody jako kategorie zamiast bezpośrednio w metaClass. W ten sposób możesz zdefiniować go raz dla wszystkich kolekcji:
Przykładowe użycie:
źródło
Czy metoda groupBy nie była dostępna, gdy zadano to pytanie?
źródło
Map<K, List<V>>
Wydaje się, że OP szuka metody z typem zwracanymMap<K, V>
, więc groupBy nie działa w tym przypadku.Jeśli potrzebujesz prostej pary klucz-wartość, metoda
collectEntries
powinna wystarczyć. Na przykładAle jeśli chcesz mieć strukturę podobną do Multimap, w której istnieje wiele wartości na klucz, powinieneś użyć
groupBy
metodyźródło
Ponadto, jeśli korzystasz z kolekcji Google ( http://code.google.com/p/google-collections/ ), możesz zrobić coś takiego:
źródło
ok ... bawiłem się tym trochę dłużej i myślę, że to całkiem fajna metoda ...
teraz każda podklasa Map lub Collection ma tę metodę ...
tutaj używam go do odwrócenia klucza / wartości w Mapie
i tutaj używam go do tworzenia mapy z listy
teraz po prostu umieszczam to w klasie, która jest wywoływana podczas uruchamiania mojej aplikacji, a ta metoda jest dostępna w całym moim kodzie.
EDYTOWAĆ:
dodać metodę do wszystkich tablic ...
źródło
Nie mogę znaleźć nic wbudowanego ... ale używając ExpandoMetaClass mogę to zrobić:
to dodaje metodę collectMap do wszystkich ArrayLists ... Nie jestem pewien, dlaczego dodanie jej do Listy lub Kolekcji nie zadziałało .. Myślę, że to inne pytanie ... ale teraz mogę to zrobić ...
z listy do obliczonej mapy z jednym zamknięciem ... dokładnie to, czego szukałem.
Edycja: powodem, dla którego nie mogłem dodać metody do listy i kolekcji interfejsów, było to, że nie zrobiłem tego:
po wywołaniu metody możesz dodać metody do interfejsów .. co w tym przypadku oznacza, że moja metoda collectMap będzie działać na zakresach takich jak ten:
co daje mapę: [0: 0, 1: 2, 2: 4]
źródło
A co z czymś takim?
źródło