Guide til Guava Multimap

1. Oversigt

I denne artikel vil vi se på en af Kort implementeringer fra Google Guava-biblioteket - Multimap. Det er en samling, der kortlægger nøgler til værdier, der ligner java.util.Kort, men hvor hver nøgle kan være associeret med flere værdier.

2. Maven-afhængighed

Lad os først tilføje en afhængighed:

 com.google.guava guava 29.0-jre 

Den seneste version kan findes her.

3. Multimap Implementering

I tilfælde af Guava Multimap, hvis vi tilføjer to værdier for den samme nøgle, tilsidesætter den anden værdi ikke den første værdi. I stedet har vi to værdier i det resulterende kort. Lad os se på en testsag:

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

Udskrivning af kort'S indhold udsendes:

{a-key = [firstValue, secondValue]}

Når vi får værdier med nøglen "a-nøgle", får vi Kollektion der indeholder "firstValue" og "secondValue" som et resultat:

Samlingsværdier = map.get (nøgle);

Udskrivningsværdier vises:

[firstValue, secondValue]

4. Sammenlignet med standarden Kort

Standardkort fra java.util pakke giver os ikke muligheden for at tildele flere værdier til den samme nøgle. Lad os overveje en simpel sag, når vi sætte() to værdier til a Kort ved hjælp af den samme tast:

String key = "a-key"; Kortkort = nyt LinkedHashMap (); map.put (nøgle, "firstValue"); map.put (nøgle, "secondValue"); assertEquals (1, map.size ()); 

Den resulterende kort har kun et element ("SecondValue"), på grund af et sekund sætte() handling, der tilsidesætter den første værdi. Skulle vi ønske at opnå den samme adfærd som med Guava Multimap, vi bliver nødt til at oprette en Kort der har en Liste som en værditype:

String key = "a-key"; Kort kort = nyt LinkedHashMap (); Listeværdier = map.get (nøgle); hvis (værdier == null) {værdier = ny LinkedList (); values.add ("firstValue"); values.add ("secondValue"); } map.put (nøgle, værdier); assertEquals (1, map.size ());

Det er klart, at det ikke er meget praktisk at bruge. Og hvis vi har et sådant behov i vores kode, så er Guava Multimap kunne være et bedre valg end java.util.Map.

En ting at bemærke her er, at selvom vi har en liste, der har to elementer i den, størrelse() metode returnerer 1. I Multimap, størrelse () returnerer et faktisk antal værdier, der er gemt i en Kort, men keySet (). størrelse () returnerer antallet af forskellige nøgler.

5. Fordele ved Multimap

Multimaps bruges ofte på steder, hvor en Kort ellers ville have dukket op. Forskellene inkluderer:

  • Det er ikke nødvendigt at udfylde en tom samling, før du tilføjer en post med sætte()
  • Get () -metoden vender aldrig tilbage nul, kun en tom samling (vi behøver ikke kontrollere mod nul som i Kort test sag)
  • En nøgle er indeholdt i Multimap hvis og kun hvis det kortlægges til mindst en værdi. Enhver handling, der får en nøgle til at have nul tilknyttede værdier, har den virkning, at nøglen fjernes fra Multimap (i Kort, selvom vi fjerner alle værdier fra samlingen, holder vi stadig tomme Kollektion som en værdi, og dette er unødvendig hukommelsesomkostning)
  • Det samlede antal indtastningsværdier er tilgængeligt som størrelse()

6. Konklusion

Denne artikel viser, hvordan og hvornår Guava skal bruges Multimap. Det sammenligner det med standard java.util.Kort og viser fordele ved Guava Multimap.

Alle disse eksempler og kodestykker findes i GitHub-projektet - dette er et Maven-projekt, så det skal være let at importere og køre som det er.


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