Мне бы для этого нужна какая-то рука:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
учитывая то, как устроен GDK, я ожидал, что смогу сделать что-то вроде:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
но я ничего не видел в документации ... я что-то упускаю? или я просто слишком ленив?
Ответы:
Недавно я столкнулся с необходимостью сделать именно это: преобразовать список в карту. Этот вопрос был опубликован до выхода Groovy версии 1.7.9, поэтому метода
collectEntries
еще не существовало. Работает в точности так, как был предложенcollectMap
метод :Если по какой-то причине вы застряли на более старой версии Groovy, этот
inject
метод также можно использовать (как предлагается здесь ). Это немного измененная версия, которая принимает только одно выражение внутри замыкания (просто для сохранения символов!):+
Оператор также может быть использован вместо<<
.источник
Отъезд "залить". Настоящие любители функционального программирования называют это «сворачиванием».
И пока вы это делаете, вы, вероятно, захотите определять методы как категории, а не прямо в метаклассе. Таким образом, вы можете определить его один раз для всех коллекций:
Пример использования:
источник
Был ли метод groupBy недоступен, когда задавался этот вопрос?
источник
Map<K, List<V>>
похоже, что OP ищет метод с типом возвращаемого значенияMap<K, V>
, поэтому groupBy в этом случае не работает.Если вам нужна простая пара "ключ-значение", этого метода
collectEntries
должно хватить. НапримерНо если вам нужна структура, подобная Multimap, в которой есть несколько значений для каждого ключа, тогда вы захотите использовать
groupBy
методисточник
Кроме того, если вы используете коллекции Google ( http://code.google.com/p/google-collections/ ), вы можете сделать что-то вроде этого:
источник
хорошо ... Я поигрался с этим еще немного, и я думаю, что это довольно крутой метод ...
теперь любой подкласс Map или Collection имеет этот метод ...
здесь я использую его, чтобы изменить ключ / значение на карте
а здесь я использую его для создания карты из списка
теперь я просто вставляю это в класс, который вызывается при запуске моего приложения, и этот метод доступен во всем моем коде.
РЕДАКТИРОВАТЬ:
чтобы добавить метод ко всем массивам ...
источник
Я не могу найти ничего встроенного ... но с помощью ExpandoMetaClass я могу сделать это:
это добавляет метод collectMap ко всем ArrayLists ... Я не уверен, почему добавление его в List или Collection не сработало ... Думаю, это для другого вопроса ... но теперь я могу это сделать ...
из списка в рассчитанную карту с одним закрытием ... именно то, что я искал.
Изменить: причина, по которой я не мог добавить метод в список интерфейсов и коллекцию, заключалась в том, что я этого не делал:
после вызова этого метода вы можете добавлять методы в интерфейсы ... что в данном случае означает, что мой метод collectMap будет работать с такими диапазонами:
что дает карту: [0: 0, 1: 2, 2: 4]
источник
А что насчет этого?
источник