GUAVA


Novas coleções


Problema


Preciso saber  a quantidade de palavras 
distintas em documento e/ou uma lista de lista de palavras.


Como fazemos isso?


Atualmente



Map counts = new HashMap();

for (String word : words) {
  Integer count = counts.get(word);
  if (count == null) {
    counts.put(word, 1);
  } else {
    counts.put(word, count + 1);
  }
}        
    





Essa abordagem apesar de correta, durante a sua criação é passivel de bugs e não traz diversas estatisticas importantes.

Por exemplo, gostariamos de saber a quantidade total de palavras distintas.



Guava WAY


Multiset<String> wordsMultiset = HashMultiset.create();
wordsMultiset
.addAll(words);
// agora podemos usar wordsMultiset.count(String) para achar a quantidade de uma palavra específica.


Problema


Em algum momento do desenvolvimento você precisou criar um Map<K, List<V>> ou Map<K, Set<V>>.


Assuma. É difícil lidar com uma estrutura dessas.



GUAVA WAY


Set<Person> aliceChildren = childrenMultimap.get(alice);
aliceChildren
.clear();
aliceChildren
.add(bob);
aliceChildren
.add(carol);


MuLTIMAP 

  • asMap views any Multimap<K, V> as a Map<K, Collection<V>>. The returned map supports remove, and changes to the returned collections write through, but the map does not support put or putAll. Critically, you can use asMap().get(key) when you want null on absent keys rather than a fresh, writable empty collection. (You can and should cast asMap.get(key) to the appropriate collection type -- aSet for a SetMultimap, a List for a ListMultimap -- but the type system does not allow ListMultimap to return Map<K, List<V>> here.)
  • entries  - retorna uma view Collection<Map.Entry<K, V>> de todos os entries no Multimap.
  • keySet - retorna uma view de chaves distintas no Multimap.
  • keys - retorna uma view de chaves do Multimap como a do Multiset, com multiplicidade igual ao ao numero de valores associados a chave. Os elementos podem ser removidos do Multiset, mas não adicionados.
  • values() - retorna uma view com todos os valores do Multimap em uma Collection<V> "reta", com todos os elementos da collection. 

Problema


Você quer transformar os valores do map em chaves
e suas chaves em valores em consequência.

Como implementar?

<Vai dar erro, vai ter bug, até acertar levará um bom tempo>


BIMAP

O BiMap<K,V>, permite fazer a  operação inverse().

Que resulta em um BiMap<V,K>

Simples não?


PROBLEMA

Normalmente, quando você está tentando indexar por mais de uma chave por vez.
 Algo do tipo Map<Nome, Mapa <LastName, Person>>, que é feio e complicado de usar. 


TABLE


Suporta este caso de uso para qualquer tipo de "linha" e tipo "coluna". Table suporta varios tipos de views para que você use os dados a partir de qualquer ponto de vista


TABLE

  • rowMap() -   Table<R, C, V>  ->  Map<R, Map<C, V>>.  
  • rowKeySet()  -  retorna Set<R>.
  • row(r) - non-null Map<C, V>.
  • Existe também o análogo para colunas: columnMap()columnKeySet(), and column(c). obs: Um acesso Column-based  é menos eficiente que row-based.
  • cellSet() - retorna uma view da Table com um set de Table.Cell<R, C, V>
  • O conceito de Cell é parecido com um Map.Entry, apenas distinguindo colunas e linhas




Dúvidas?

Guava - Novas Coleções

By Alex Rios

Guava - Novas Coleções

  • 337