Guia do Guava Multimap

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á.