Guia do Guava Multimap
1. Visão geral
Neste artigo, veremos uma das implementações deMap da biblioteca Google Guava -Multimap. É uma coleção que mapeia chaves para valores, semelhante ajava.util.Map, mas em que cada chave pode estar associada a vários valores.
2. Dependência do Maven
Primeiro, vamos adicionar uma dependência:
com.google.guava
guava
21.0
A versão mais recente pode ser encontradahere.
3. Implementação deMultimap
No caso de GuavaMultimap,, se adicionarmos dois valores para a mesma chave, o segundo valor não substituirá o primeiro valor. Em vez disso, teremos dois valores nomap resultante. Vejamos um caso de teste:
String key = "a-key";
Multimap map = ArrayListMultimap.create();
map.put(key, "firstValue");
map.put(key, "secondValue");
assertEquals(2, map.size());
Imprimir o conteúdo demap produzirá:
{a-key=[firstValue, secondValue]}
Quando obtermos valores pela chave “a-key”, obteremosCollection<String> que contém “firstValue” e “secondValue” como resultado:
Collection values = map.get(key);
Os valores de impressão serão impressos:
[firstValue, secondValue]
4. Comparado com o padrãoMap
O mapa padrão do pacotejava.util não nos dá a capacidade de atribuir vários valores à mesma chave. Vamos considerar um caso simples em queput() dois valores em umMap usando a mesma chave:
String key = "a-key";
Map map = new LinkedHashMap<>();
map.put(key, "firstValue");
map.put(key, "secondValue");
assertEquals(1, map.size());
Omap resultante tem apenas um elemento (“secondValue”), por causa de uma segunda operaçãoput() que substitui o primeiro valor. Se quisermos obter o mesmo comportamento que comMultimap, de Guava, precisaríamos criar umMap que tem umList<String> como tipo de valor:
String key = "a-key";
Map> map = new LinkedHashMap<>();
List values = map.get(key);
if(values == null) {
values = new LinkedList<>();
values.add("firstValue");
values.add("secondValue");
}
map.put(key, values);
assertEquals(1, map.size());
Obviamente, não é muito conveniente de usar. E se tivermos essa necessidade em nosso código,Multimap de Guava poderia ser uma escolha melhor do quejava.util.Map.
Uma coisa a notar aqui é que, embora tenhamos uma lista com dois elementos, o métodosize() retorna 1. EmMultimap, size() retorna um número real de valores armazenados emMap,, maskeySet().size() retorna o número de chaves distintas.
5. Prós deMultimap
Multimaps são comumente usados em lugares onde umMap<K, Collection<V>> teria aparecido de outra forma. As diferenças incluem:
-
Não há necessidade de preencher uma coleção vazia antes de adicionar uma entrada comput()
-
The get() method nunca retornanull, apenas uma coleção vazia (não precisamos verificarnull como no caso de testeMap<String, Collection<V>>)
-
Uma chave está contida emMultimap se e somente se ela for mapeada para pelo menos um valor. Qualquer operação que faz com que uma chave tenha zero valores associados, tem o efeito de remover essa chave deMultimap (emMap<String, Collection<V>>,, mesmo se removermos todos os valores da coleção, ainda manteremos umCollection como um valor, e isso é sobrecarga de memória desnecessária)
-
A contagem total de valores de entrada está disponível comosize()
6. Conclusão
Este artigo mostra como e quando usar GoiabaMultimap. Ele compara com ojava.util.Map padrão e mostra os prós do GoiabaMultimap.
Todos esses exemplos e trechos de código podem ser encontrados emGitHub project - este é um projeto Maven, portanto, deve ser fácil de importar e executar como está.