Guida alla Guava BiMap

1. Panoramica

In questo tutorial, mostreremo come utilizzare l' interfaccia BiMap di Google Guava e le sue molteplici implementazioni.

Una BiMap (o "mappa bidirezionale") è un tipo speciale di mappa che mantiene una visualizzazione inversa della mappa, assicurando che non siano presenti valori duplicati e che un valore possa sempre essere utilizzato in sicurezza per recuperare la chiave.

L'implementazione di base di BiMap è HashBiMap dove internamente fa uso di due Map , una per la mappatura da chiave a valore e l'altra per la mappatura da valore a chiave.

2. BiMap di Google Guava

Diamo un'occhiata a come utilizzare la classe BiMap .

Inizieremo aggiungendo la dipendenza della libreria Guava di Google nel pom.xml :

 com.google.guava guava 21.0 

L'ultima versione della dipendenza può essere verificata qui.

3. Creazione di una BiMap

Puoi creare un'istanza di BiMap in diversi modi come segue:

  • Se hai intenzione di gestire un oggetto Java personalizzato, usa il metodo create dalla classe HashBiMap:
BiMap capitalCountryBiMap = HashBiMap.create();
  • Se disponiamo già di una mappa esistente, puoi creare un'istanza di BiMap utilizzando una versione sovraccarica del metodo create da una classe HashBiMap :
Map capitalCountryBiMap = new HashMap(); //... HashBiMap.create(capitalCountryBiMap); 
  • Se hai intenzione di gestire una chiave di tipo Enum, usa il metodo create dalla classe EnumHashBiMap :
BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class); 
  • Se intendi creare una mappa immutabile, usa la classe ImmutableBiMap (che segue uno schema builder):
BiMap capitalCountryBiMap = new ImmutableBiMap.Builder() .put("New Delhi", "India") .build(); 

4. Utilizzo di BiMap

Cominciamo con un semplice esempio che mostra l'utilizzo di BiMap, dove possiamo ottenere una chiave basata su un valore e un valore basato su una chiave:

@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: il metodo inverso sopra restituisce la vista inversa della BiMap , che mappa ciascuno dei valori della BiMap sulle chiavi associate.

BiMap genera un'eccezione IllegalArgumentException quando proviamo a memorizzare due volte un valore duplicato.

Vediamo un esempio dello stesso:

@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 desideriamo sovrascrivere il valore già presente in BiMap , possiamo utilizzare il metodo 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. conclusione

In questo breve tutorial, abbiamo illustrato esempi di utilizzo di BiMap nella libreria Guava. Viene utilizzato principalmente per ottenere una chiave in base al valore dalla mappa.

L'implementazione di questi esempi può essere trovata nel progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.