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
- 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.