Sprievodca po Guava Multimap

1. Prehľad

V tomto článku sa pozrieme na jednu z Mapa implementácie z knižnice Google Guava - Multimap. Je to kolekcia, ktorá mapuje kľúče na hodnoty podobné java.util.Map, ale v ktorom môže byť každý kľúč priradený k viacerým hodnotám.

2. Závislosť od Maven

Najskôr pridajme závislosť:

 com.google.guava guava 29.0-jre 

Najnovšiu verziu nájdete tu.

3. Multimap Implementácia

V prípade Guava Multimapa, ak k rovnakému kľúču pridáme dve hodnoty, druhá hodnota neprepíše prvú hodnotu. Namiesto toho budeme mať vo výsledku dve hodnoty mapa. Pozrime sa na testovací prípad:

Reťazec key = "a-key"; Multimapová mapa = ArrayListMultimap.create (); map.put (kľúč, "firstValue"); map.put (kľúč, "secondValue"); assertEquals (2, map.size ()); 

Tlač mapaNa výstup bude obsah:

{a-key = [firstValue, secondValue]}

Keď dostaneme hodnoty pomocou kľúča „a-key“, dostaneme Zbierka ktorá ako výsledok obsahuje hodnoty „firstValue“ a „secondValue“:

Hodnoty zbierky = map.get (kľúč);

Výstupné hodnoty tlače:

[firstValue, secondValue]

4. V porovnaní so štandardom Mapa

Štandardná mapa z java.util balík nám nedáva možnosť priradiť viac hodnôt tomu istému kľúču. Zvážme jednoduchý prípad, keď put () dve hodnoty do a Mapa pomocou rovnakého kľúča:

Reťazec key = "a-key"; Mapa mapy = new LinkedHashMap (); map.put (kľúč, "firstValue"); map.put (kľúč, "secondValue"); assertEquals (1, map.size ()); 

Výsledný mapa má iba jeden prvok („SecondValue“), kvôli sekunde put () operácia, ktorá má prednosť pred prvou hodnotou. Ak by sme chceli dosiahnuť rovnaké správanie ako u Guavy Multimap, potrebovali by sme vytvoriť Mapa ktorá má a Zoznam ako typ hodnoty:

Reťazec key = "a-key"; Mapa map = new LinkedHashMap (); Zoznam hodnôt = map.get (kľúč); if (values ​​== null) {values ​​= new LinkedList (); values.add ("firstValue"); values.add ("secondValue"); } map.put (kľúč, hodnoty); assertEquals (1, map.size ());

Je zrejmé, že použitie nie je príliš pohodlné. A ak máme takúto potrebu v našom kódexe, potom Guava Multimap môže byť lepšou voľbou ako java.util.Map.

Tu si treba všimnúť, že aj keď máme zoznam, ktorý obsahuje dva prvky, veľkosť () metóda vráti 1. V Multimapa, veľkosť () vráti skutočný počet hodnôt uložených v a Mapa, ale keySet (). size () vráti počet odlišných klávesov.

5. Pros Multimap

Multimapy sa bežne používajú na miestach, kde a Mapa by sa inak objavili. Rozdiely zahŕňajú:

  • Pred pridaním položky pomocou nie je potrebné vyplniť prázdnu zbierku put ()
  • Metóda get () nikdy sa nevracia nulový, iba prázdna zbierka (nemusíme skontrolovať nulový ako v Mapa testovacia situácia)
  • Kľúč je obsiahnutý v Multimap len a len vtedy, ak sa mapuje aspoň na jednu hodnotu. Akákoľvek operácia, ktorá spôsobí, že kľúč má nulové hodnoty, má za následok odstránenie tohto kľúča z Multimap (v Mapa, aj keď z kolekcie odstránime všetky hodnoty, stále zostane prázdna Zbierka ako hodnota, a to je zbytočná réžia pamäte)
  • Celkový počet vstupných hodnôt je k dispozícii ako veľkosť ()

6. Záver

Tento článok ukazuje, ako a kedy používať Guavu Multimap. Porovnáva to so štandardom java.util.Map a ukazuje klady Guavy Multimap.

Všetky tieto príklady a útržky kódu nájdete v projekte GitHub - toto je projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found