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