Guide til Guava Multimap

1. Oversikt

I denne artikkelen vil vi se på en av Kart implementeringer fra Google Guava-biblioteket - Multikart. Det er en samling som kartlegger nøkler til verdier, som ligner på java.util.Kart, men der hver tast kan være assosiert med flere verdier.

2. Maven avhengighet

La oss først legge til en avhengighet:

 com.google.guava guava 29.0-jre 

Den siste versjonen finner du her.

3. Multikart Gjennomføring

I tilfelle Guava Multimap, hvis vi legger til to verdier for samme nøkkel, overstyrer ikke den andre verdien den første verdien. I stedet vil vi ha to verdier i det resulterende kart. La oss se på en prøvesak:

Strengnøkkel = "a-tast"; Multimap-kart = ArrayListMultimap.create (); map.put (nøkkel, "firstValue"); map.put (nøkkel, "secondValue"); assertEquals (2, map.size ()); 

Skrive ut kartInnholdet sendes ut:

{a-key = [firstValue, secondValue]}

Når vi får verdier med nøkkel “a-nøkkel” vil vi få Samling som inneholder "firstValue" og "secondValue" som et resultat:

Samlingsverdier = map.get (nøkkel);

Utskriftsverdier vil vises:

[firstValue, secondValue]

4. Sammenlignet med standarden Kart

Standard kart fra java.util pakken gir oss ikke muligheten til å tilordne flere verdier til samme nøkkel. La oss vurdere en enkel sak når vi sette() to verdier til a Kart ved hjelp av samme tast:

Strengnøkkel = "a-tast"; Kartkart = nytt LinkedHashMap (); map.put (nøkkel, "firstValue"); map.put (nøkkel, "secondValue"); assertEquals (1, map.size ()); 

Resultatet kart har bare ett element (“SecondValue”), på grunn av et sekund sette() operasjon som overstyrer den første verdien. Skulle vi ønske å oppnå den samme oppførselen som med Guava Multikart, vi trenger å lage en Kart som har en Liste som en verditype:

Strengnøkkel = "a-tast"; Kart map = new LinkedHashMap (); Listeverdier = map.get (nøkkel); hvis (verdier == null) {verdier = ny LinkedList (); values.add ("firstValue"); values.add ("secondValue"); } map.put (nøkkel, verdier); assertEquals (1, map.size ());

Åpenbart er det ikke veldig praktisk å bruke. Og hvis vi har et slikt behov i koden vår, så er Guava Multikart kan være et bedre valg enn java.util.Kart.

En ting å merke seg her er at selv om vi har en liste som har to elementer i seg, størrelse() metoden returnerer 1. I Multimap, størrelse () returnerer et faktisk antall verdier som er lagret i a Kart, men keySet (). størrelse () returnerer antall forskjellige nøkler.

5. Fordeler med Multikart

Multimaps brukes ofte på steder der en Kart ellers hadde dukket opp. Forskjellene inkluderer:

  • Det er ikke nødvendig å fylle ut en tom samling før du legger til en oppføring med sette()
  • Get () -metoden kommer aldri tilbake null, bare en tom samling (vi trenger ikke sjekke mot null som i Kart testforsøk)
  • En nøkkel er inneholdt i Multikart hvis og bare hvis den tilordnes til minst en verdi. Enhver operasjon som får en nøkkel til å ha null tilknyttede verdier, har den effekten at den fjernes fra nøkkelen Multikart (i Kart, selv om vi fjerner alle verdier fra samlingen, holder vi fortsatt tomme Samling som en verdi, og dette er unødvendig minneoverhead)
  • Totalt antall oppføringsverdier er tilgjengelig som størrelse()

6. Konklusjon

Denne artikkelen viser hvordan og når du skal bruke Guava Multikart. Det sammenligner det med standard java.util.Kart og viser proffer av Guava Multikart.

Alle disse eksemplene og kodebitene finner du i GitHub-prosjektet - dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.


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