Vodič za Guava Multimap

1. Pregled

U ovom ćemo članku pogledati jedan od Karta implementacije iz Google Guava knjižnice - Multimap. To je zbirka koja preslikava ključeve u vrijednosti slične java.util.Map, ali u kojem svaki ključ može biti povezan s više vrijednosti.

2. Ovisnost Mavena

Prvo, dodajmo ovisnost:

 com.google.guava guava 29,0-jre 

Najnoviju verziju možete pronaći ovdje.

3. Multimap Provedba

U slučaju Guave Multimap, ako dodamo dvije vrijednosti za isti ključ, druga vrijednost neće nadjačati prvu vrijednost. Umjesto toga, rezultirat ćemo dvije vrijednosti karta. Pogledajmo test slučaj:

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

Ispis kartaIzlazit će sadržaj:

{a-key = [firstValue, secondValue]}

Kad ćemo dobiti vrijednosti ključem "a-ključ", dobit ćemo Kolekcija koja kao rezultat sadrži "firstValue" i "secondValue":

Vrijednosti zbirke = map.get (ključ);

Ispisat će se vrijednosti:

[prva vrijednost, druga vrijednost]

4. U usporedbi sa Standardom Karta

Standardna karta od java.util paket nam ne daje mogućnost dodijeliti više vrijednosti istom ključu. Razmotrimo jednostavan slučaj kada mi staviti() dvije vrijednosti u a Karta koristeći isti ključ:

String key = "a-key"; Karta karte = novo LinkedHashMap (); map.put (ključ, "firstValue"); map.put (ključ, "secondValue"); assertEquals (1, map.size ()); 

Dobivena karta ima samo jedan element ("Druga vrijednost"), zbog sekunde staviti() operacija koja nadjačava prvu vrijednost. Trebamo li postići isto ponašanje kao kod Guave Multimap, trebali bismo stvoriti Karta koja ima Popis kao vrsta vrijednosti:

String ključ = "a-ključ"; Karta karta = nova LinkedHashMap (); Vrijednosti popisa = map.get (ključ); if (values ​​== null) {values ​​= new LinkedList (); values.add ("firstValue"); values.add ("secondValue"); } map.put (ključ, vrijednosti); assertEquals (1, map.size ());

Očito je da nije baš prikladan za upotrebu. A ako u našem kodu imamo takvu potrebu, onda i Guavinu Multimap mogao biti bolji izbor od java.util.Map.

Ovdje treba primijetiti da, iako imamo popis koji sadrži dva elementa, veličina() metoda vraća 1. U Multimap, veličina () vraća stvarni broj vrijednosti pohranjenih u a Karta, ali keySet (). size () vraća broj različitih tipki.

5. Pros Multimap

Multimaps se obično koriste na mjestima gdje a Karta inače bi se pojavio. Razlike uključuju:

  • Nije potrebno popuniti praznu zbirku prije dodavanja unosa s staviti()
  • Metoda get () nikad se ne vraća null, samo prazna zbirka (ne trebamo provjeravati null kao u Karta test slučaj)
  • Ključ je sadržan u Multimap ako i samo ako se preslika na barem jednu vrijednost. Svaka operacija koja uzrokuje da ključ ima nula pridruženih vrijednosti ima za posljedicu uklanjanje tog ključa iz Multimap (u Karta, čak i ako uklonimo sve vrijednosti iz zbirke, i dalje ostajemo prazni Kolekcija kao vrijednost, a to je nepotrebno opterećenje memorije)
  • Ukupni unos vrijednosti unosa dostupan je kao veličina()

6. Zaključak

Ovaj članak pokazuje kako i kada koristiti Guavu Multimap. Uspoređuje ga sa standardnim java.util.Map i pokazuje profesionalce Guave Multimap.

Svi ovi primjeri i isječci koda mogu se naći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.