Eu gostaria de algum tipo de mão para isso:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
dada a forma como as coisas do GDK são, espero ser capaz de fazer algo como:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
mas eu não vi nada nos documentos ... estou faltando alguma coisa? ou eu sou apenas preguiçoso?
Respostas:
Recentemente, descobri a necessidade de fazer exatamente isso: converter uma lista em um mapa. Esta questão foi postada antes do lançamento da versão 1.7.9 do Groovy, então o método
collectEntries
ainda não existia. Funciona exatamente como ocollectMap
método proposto :Se por algum motivo você ficar preso a uma versão mais antiga do Groovy, o
inject
método também pode ser usado (conforme proposto aqui ). Esta é uma versão ligeiramente modificada que leva apenas uma expressão dentro do encerramento (apenas para salvar caracteres!):O
+
operador também pode ser usado no lugar do<<
.fonte
Confira "injetar". Os verdadeiros especialistas em programação funcional chamam isso de "dobrar".
E, enquanto você está nisso, provavelmente deseja definir métodos como categorias em vez de diretamente na metaClasse. Dessa forma, você pode defini-lo uma vez para todas as coleções:
Exemplo de uso:
fonte
O método groupBy não estava disponível quando esta pergunta foi feita?
fonte
Map<K, List<V>>
. Parece que o OP está procurando um método com tipo de retornoMap<K, V>
, portanto groupBy não funciona neste caso.Se você precisa de um par de valores-chave simples, o método
collectEntries
deve ser suficiente. Por exemploMas se você quiser uma estrutura semelhante a um multimapa, na qual existem vários valores por chave, você deve usar o
groupBy
métodofonte
Além disso, se você usa coleções do Google ( http://code.google.com/p/google-collections/ ), pode fazer algo assim:
fonte
ok ... brinquei um pouco mais com isso e acho que é um método bem legal ...
agora qualquer subclasse de Mapa ou Coleção tem este método ...
aqui eu uso para reverter a chave / valor em um mapa
e aqui eu uso para criar um mapa a partir de uma lista
agora eu apenas coloco isso em uma classe que é chamada quando meu aplicativo está iniciando e esse método está disponível em todo o meu código.
EDITAR:
para adicionar o método a todos os arrays ...
fonte
Não consigo encontrar nada integrado ... mas usando ExpandoMetaClass posso fazer isso:
isso adiciona o método collectMap a todos os ArrayLists ... Não tenho certeza por que adicioná-lo a List ou Collection não funcionou. Acho que é outra questão ... mas agora posso fazer isso ...
da lista ao mapa calculado com um fechamento ... exatamente o que eu estava procurando.
Editar: o motivo pelo qual não consegui adicionar o método às interfaces Lista e Coleção foi porque não fiz isso:
após essa chamada de método, você pode adicionar métodos a interfaces .. o que, neste caso, significa que meu método collectMap funcionará em intervalos como este:
que produz o mapa: [0: 0, 1: 2, 2: 4]
fonte
Que tal algo assim?
fonte