Guida a Guava Multimap

1. Panoramica

In questo articolo, esamineremo una delle implementazioni di mappe dalla libreria Guava di Google: Multimap . È una raccolta che associa le chiavi ai valori, in modo simile a java.util.Map , ma in cui ogni chiave può essere associata a più valori.

2. Dipendenza da Maven

Innanzitutto, aggiungiamo una dipendenza:

 com.google.guava guava 29.0-jre 

L'ultima versione può essere trovata qui.

3. Implementazione multimappa

Nel caso di Guava Multimap, se aggiungiamo due valori per la stessa chiave, il secondo valore non sovrascriverà il primo valore. Invece, avremo due valori nella mappa risultante . Diamo un'occhiata a un caso di test:

String key = "a-key"; Multimap map = ArrayListMultimap.create(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(2, map.size()); 

La stampa del contenuto della mappa produrrà:

{a-key=[firstValue, secondValue]}

Quando otterremo i valori dalla chiave "a-key", otterremo una raccolta che contiene "firstValue" e "secondValue" come risultato:

Collection values = map.get(key);

I valori di stampa produrranno:

[firstValue, secondValue]

4. Rispetto alla mappa standard

La mappa standard dal pacchetto java.util non ci dà la possibilità di assegnare più valori alla stessa chiave. Consideriamo un semplice caso in cui inseriamo () due valori in una mappa utilizzando la stessa chiave:

String key = "a-key"; Map map = new LinkedHashMap(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(1, map.size()); 

La mappa risultante ha un solo elemento ( "secondValue"), a causa di una seconda operazione put () che sovrascrive il primo valore. Se vogliamo ottenere lo stesso comportamento del Multimap di Guava , dovremmo creare una mappa che abbia una lista come tipo di valore:

String key = "a-key"; Map
    
      map = new LinkedHashMap(); List values = map.get(key); if(values == null) { values = new LinkedList(); values.add("firstValue"); values.add("secondValue"); } map.put(key, values); assertEquals(1, map.size());
    

Ovviamente non è molto comodo da usare. E se abbiamo tale esigenza nel nostro codice, Multimap di Guava potrebbe essere una scelta migliore di java.util.Map.

Una cosa da notare qui è che, sebbene abbiamo una lista che contiene due elementi, il metodo size () restituisce 1. In Multimap, size () restituisce un numero effettivo di valori memorizzati in una mappa, ma keySet (). Size () restituisce il numero di chiavi distinte.

5. Pro di Multimap

Le mappe multiple sono comunemente utilizzate nei luoghi in cui una mappa altrimenti sarebbe apparso. Le differenze includono:

  • Non è necessario popolare una raccolta vuota prima di aggiungere una voce con put ()
  • Il metodo get () non restituisce mai null , solo una raccolta vuota (non è necessario controllare con null come in Map caso di prova)
  • Una chiave è contenuta nel Multimap se e solo se mappa almeno un valore. Qualsiasi operazione che fa sì che una chiave abbia zero valori associati, ha l'effetto di rimuovere quella chiave dal Multimap (in Map , anche se rimuoviamo tutti i valori dalla raccolta, manteniamo comunque una raccolta vuota come valore, e questo è un sovraccarico di memoria non necessario)
  • Il conteggio dei valori di immissione totale è disponibile come size ()

6. Conclusione

Questo articolo mostra come e quando utilizzare Guava Multimap. Lo confronta con java.util.Map standard e mostra i pro di Guava Multimap.

Tutti questi esempi e frammenti di codice possono essere trovati nel progetto GitHub: questo è un progetto Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.