Guia do BiMap Guava
1. Visão geral
Neste tutorial, mostraremos como usar a interfaceBiMap do Google Guava e suas várias implementações.
UmBiMap (ou “mapa bidirecional”) é um tipo especial de mapa que mantém uma visão inversa do mapa, garantindo que nenhum valor duplicado esteja presente e um valor possa sempre ser usado com segurança para obter a chave de volta.
A implementação básica deBiMap éHashBiMap, onde internamente faz uso de doisMaps, um para o mapeamento de chave para valor e outro para o mapeamento de valor para chave.
2. BiMap do Google Guava
Vamos dar uma olhada em como usar a classeBiMap.
Começaremos adicionando a dependência da biblioteca Google Guava empom.xml:
com.google.guava
guava
21.0
A versão mais recente da dependência pode ser verificadahere.
3. Criando um BiMap
Você pode criar uma instância deBiMap de várias maneiras, da seguinte maneira:
-
Se você for lidar com um objeto Java personalizado, use o métodocreate da classe HashBiMap:
BiMap capitalCountryBiMap = HashBiMap.create();
-
Se já temos um mapa existente, você pode criar uma instância deBiMap usando uma versão sobrecarregada do métodocreate de uma classeHashBiMap:
Map capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
-
Se você vai lidar com uma chave do tipoEnum,, use o métodocreate da classeEnumHashBiMap:
BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
-
Se você pretende criar um mapa imutável, use a classeImmutableBiMap (que segue um padrão construtor):
BiMap capitalCountryBiMap
= new ImmutableBiMap.Builder<>()
.put("New Delhi", "India")
.build();
4. Usando o BiMap
Vamos começar com um exemplo simples que mostra o uso deBiMap,, onde podemos obter uma chave com base em um valor e um valor com base em uma chave:
@Test
public void givenBiMap_whenQueryByValue_shouldReturnKey() {
BiMap capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("New Delhi", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
String keyFromBiMap = capitalCountryBiMap.inverse().get("Russia");
String valueFromBiMap = capitalCountryBiMap.get("Washington, D.C.");
assertEquals("Moscow", keyFromBiMap);
assertEquals("USA", valueFromBiMap);
}
Nota: o métodoinverse acima retorna a visão inversa deBiMap, que mapeia cada um dos valores do BiMap para suas chaves associadas.
BiMap lança umIllegalArgumentException quando tentamos armazenar um valor duplicado duas vezes.
Vejamos um exemplo do mesmo:
@Test(expected = IllegalArgumentException.class)
public void givenBiMap_whenSameValueIsPresent_shouldThrowException() {
BiMap capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("Mumbai", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
capitalCountryBiMap.put("New Delhi", "India");
}
Se quisermos substituir o valor já presente emBiMap, podemos fazer uso do métodoforcePut:
@Test
public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() {
BiMap capitalCountryBiMap = HashBiMap.create();
capitalCountryBiMap.put("Mumbai", "India");
capitalCountryBiMap.put("Washington, D.C.", "USA");
capitalCountryBiMap.put("Moscow", "Russia");
capitalCountryBiMap.forcePut("New Delhi", "India");
assertEquals("USA", capitalCountryBiMap.get("Washington, D.C."));
assertEquals("Washington, D.C.", capitalCountryBiMap.inverse().get("USA"));
}
5. Conclusão
Neste tutorial conciso, ilustramos exemplos de uso deBiMap na biblioteca Guava. É usado predominantemente para obter uma chave com base no valor do mapa.
A implementação desses exemplos pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.