Guía del BiMap de Guayaba

1. Información general

En este tutorial, mostraremos cómo utilizar la interfaz BiMap de Google Guava y sus múltiples implementaciones.

Un BiMap (o "mapa bidireccional") es un tipo especial de mapa que mantiene una vista inversa del mapa al tiempo que garantiza que no haya valores duplicados y que siempre se pueda utilizar un valor de forma segura para recuperar la clave.

La implementación básica de BiMap es HashBiMap, donde internamente hace uso de dos mapas , uno para el mapeo de clave a valor y el otro para el mapeo de valor a clave.

2. BiMap de Google Guava

Echemos un vistazo a cómo usar la clase BiMap .

Comenzaremos agregando la dependencia de la biblioteca de Google Guava en el pom.xml :

 com.google.guava guava 21.0 

La última versión de la dependencia se puede consultar aquí.

3. Creación de un BiMap

Puede crear una instancia de BiMap de varias formas de la siguiente manera:

  • Si va a tratar con un objeto Java personalizado, use el método de creación de la clase HashBiMap:
BiMap capitalCountryBiMap = HashBiMap.create();
  • Si ya tenemos un mapa existente, puede crear una instancia de un BiMap usando una versión sobrecargada del método de creación de una clase HashBiMap :
Map capitalCountryBiMap = new HashMap(); //... HashBiMap.create(capitalCountryBiMap); 
  • Si va a tratar con una clave de tipo Enum, use el método create de la clase EnumHashBiMap :
BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class); 
  • Si tiene la intención de crear un mapa inmutable, use la clase ImmutableBiMap (que sigue un patrón de construcción):
BiMap capitalCountryBiMap = new ImmutableBiMap.Builder() .put("New Delhi", "India") .build(); 

4. Usando el BiMap

Comencemos con un ejemplo simple que muestra el uso de BiMap, donde podemos obtener una clave basada en un valor y un valor basado en una clave:

@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: el método inverso anterior devuelve la vista inversa de BiMap , que asigna cada uno de los valores de BiMap a sus claves asociadas.

BiMap arroja una IllegalArgumentException cuando intentamos almacenar un valor duplicado dos veces.

Veamos un ejemplo de lo mismo:

@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"); } 

Si deseamos anular el valor que ya está presente en BiMap , podemos hacer uso del método forcePut :

@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. Conclusión

En este tutorial conciso, ilustramos ejemplos de uso de BiMap en la biblioteca de Guava. Se utiliza principalmente para obtener una clave basada en el valor del mapa.

La implementación de estos ejemplos se puede encontrar en el proyecto GitHub; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.