Não sei como só vi isto agora mas já está disponível há algum tempo, embora ainda em 0.5 (Alpha).
Trata-se uma biblioteca desenvolvida internamente por pessoal do Google e disponibilizada ao público em geral com uma licença opensource. Pretende ser
uma extensão às Java collections, e as colecções estendem os tipos base das colecções.
Novas Collections
São definidos, os seguintes novos tipos de colecções:
- BiMap
- Multimap
Esta interface estende Map e permite ter um Map bidireccional, ou seja, em que é possível aceder por chave e/ou por valor. São fornecidas três implementações: HashBiMap, EnumBiMap e HashEnumBiMap.
O HashBiMap contém dois HashMaps e permite a utilização de chaves e valores null. O EnumBiMap utiliza dois EnumMaps na sua implementação mas não permite chaves e valores null. O HashEnumBiMap é um misto, sendo que utiliza um EnumMap para mapear chaves para valores e um HashMap para mapear valores para chaves.
É uma Map que pode ter vários valores para cada chave, ou seja, pode-se fazer algo como
myMultimap.put(chavexpto,valorA);
As vezes que quisermos, com a mesma chave. Existem dois interfaces principais que extendem Multimap: ListMultimap e SetMultimap.
O ListMultimap guarda internamente os valores para uma chave numa lista ordenada, preservando assim ordem de inserção. São fornecidas as implementações ArrayListMultimap e LinkedListMultimap.
O SetMultimap utiliza um Set para guardar os valores de cada chave e por isso não permite pares (chave,valor) repetido. São fornecidas as implementações HashMultimap, LinkedHashMultimap e TreeMultimap. Os nomes penso que são intuitivos
É simplesmente um Set que permite duplicados, comummente chamado de Bag.
Cada elemento tem um número de ocorrências, sendo que a noção de vários elementos com o mesmo valor não tem lógica, mas sim um elemento com X ocorrências. O número de ocorrências de um elemento é alterado quando o mesmo valor é inserido várias vezes e a igualidade entre valores é dependente da classe implementadora do Multiset (e.g. um HashMultiset poderá simplesmente comparar hashcodes, outro poderá ter uma aproximação diferente). Para oferecer esta noção de ocorrência, é fornecido o método
int count(Object);
São fornecidas as implementações EnumMultiset, HashMultiset, LinkedHashMultiset e TreeMultiset.
Além destas, existem mais classes de colecções derivadas, que estendem algumas das que aqui falei.
Classes Auxiliares
São fornecidas inúmeras classes auxiliares, mais do que as que consigo enumerar aqui e a maioria ainda nem olhei para elas.
Posso destacar alguns helpers, como seja por exemplo os Builders para criar colecções imutáveis de Multimap e BiMap ou um muito útil AbstractIterator, para facilitar a implementação de Iterators.
São fornecidas também Forward Collections, que são colecções que delegam o processamento dos seus métodos nos métodos de uma classe filha. Isto é útil porque a maioria das classes fornecidas pelo google collections library são
final e esta é a forma de adicionar comportamento personalizado. O pattern usado nestas forward collections é o decorator.
Base Google Goodies
Além das colecções e classes auxiliares relacionadas, são incluídas e utilizadas classes base e utilitárias google. São coisas simples e algumas delas bem pensadas e que podem ser utilizadas no dia-a-dia. Destaco a classe Preconditions: um conjunto de métodos estáticos para serem usados no início de métodos, para verificar pré-condições de argumentos e verificações de estado interno. Existem soluções de contratos mais completas obviamente mas como solução leve e prática é bastante usável.
Por fim, o mais importante, vão ao site do Google Collections Library, saquem o snapshot e vejam por vocês próprios. Poderá vir a ser uma boa adição aos nossos projectos.