Veiledning til Apache Commons MultiValuedMap

1. Oversikt

I denne raske opplæringen vil vi ta en titt på MultiValuedMap grensesnitt gitt i Apache Commons Collections-biblioteket.

MultiValuedMap gir et enkelt API for å kartlegge hver nøkkel til en samling verdier i Java. Det er etterfølgeren til org.apache.commons.collections4.MultiMap, som ble utfaset i Commons Collection 4.1.

2. Maven avhengighet

For Maven-prosjekter må vi legge til felles-samlinger4 avhengighet:

 org.apache.commons commons-collection4 4.2 

3. Legge til elementer i en MultiValuedMap

Vi kan legge til elementer ved hjelp av sette og putt alle metoder.

La oss starte med å lage en forekomst av MultiValuedMap:

MultiValuedMap-kart = nytt ArrayListValuedHashMap ();

La oss deretter se hvordan vi kan legge til elementer en om gangen ved hjelp av sette metode:

map.put ("frukt", "eple"); map.put ("frukt", "oransje");

I tillegg, la oss legge til noen elementer ved hjelp av putt alle metode, som kartlegger en nøkkel til flere elementer i en samtale:

map.putAll ("kjøretøy", Arrays.asList ("bil", "sykkel")); assertThat ((Collection) map.get ("vehicles")) .containsExactly ("car", "bike");

4. Henter elementer fra en MultiValuedMap

MultiValuedMap gir metoder for å hente nøkler, verdier og nøkkelverditilordning. La oss ta en titt på hver av disse.

4.1. Få alle verdiene til en nøkkel

For å få alle verdier tilknyttet en nøkkel, kan vi brukemetode, som returnerer a Samling:

assertThat ((Collection) map.get ("fruits")) .containsExactly ("apple", "orange");

4.2. Få alle nøkkelverdikartlegginger

Eller vi kan bruke innganger metode for å få en Samling av alle nøkkelverdikartlegginger som finnes på kartet:

Samling oppføringer = map.entries ();

4.3. Få alle nøkler

Det er to metoder for å hente alle nøklene i a MultiValuedMap.

La oss bruke nøklene metode for å få en MultiSet visning av tastene:

MultiSet-taster = map.keys (); assertThat (nøkler) .contains ("frukt", "kjøretøy");

Alternativt kan vi få en Sett visning av tastene ved hjelp av keySet metode:

Sett nøkler = map.keySet (); assertThat (nøkler) .contains ("frukt", "kjøretøy");

4.4. Få alle verdiene til et kart

Til slutt, hvis vi ønsker å få en Samling visning av alle verdiene i kartet, kan vi bruke verdier metode:

Samlingsverdier = map.values ​​(); assertThat (verdier) .contains ("apple", "orange", "car", "bike");

5. Fjerne elementer fra en MultiValuedMap

La oss nå se på alle metodene for å fjerne elementer og nøkkelverdikartlegginger.

5.1. Fjern alle elementene som er tilordnet en nøkkel

La oss først se hvordan du fjerner alle verdier tilknyttet en spesifisert nøkkel ved hjelp av fjerne metode:

Samling removedValues ​​= map.remove ("frukt"); assertThat (map.containsKey ("fruits")). isFalse (); assertThat (removedValues) .contains ("apple", "orange");

Denne metoden returnerer a Samling visning av de fjernede verdiene.

5.2. Fjern en enkelt nøkkelverdikartlegging

Anta at vi har en nøkkel tilordnet flere verdier, men vi vil bare fjerne en av de tilordnede verdiene, og etterlate de andre. Vi kan enkelt gjøre dette ved hjelp av removeMapping metode:

boolsk isRemoved = map.removeMapping ("frukt", "eple"); assertThat (map.containsMapping ("fruits", "apple")). isFalse ();

5.3. Fjern alle nøkkelverdikartlegginger

Og til slutt kan vi bruke klar metode for å fjerne alle kartlegginger fra kartet:

map.clear (); assertThat (map.isEmpty ()). isTrue ();

6. Kontroll Elementer fra en MultiValuedMap

Deretter, la oss ta en titt på de forskjellige metodene for å sjekke om en spesifisert nøkkel eller verdi finnes i kartet vårt.

6.1. Sjekk om det finnes en nøkkel

For å finne ut om kartet vårt inneholder en kartlegging for en spesifisert nøkkel, kan vi bruke inneholder nøkkel metode:

assertThat (map.containsKey ("kjøretøy")). isTrue ();

6.2. Sjekk om det finnes en verdi

Anta at vi vil sjekke om minst en nøkkel i kartet vårt inneholder en kartlegging for en bestemt verdi. Vi kan gjøre dette ved hjelp av inneholder verdi metode:

assertThat (map.containsValue ("orange")). isTrue ();

6.3. Sjekk om det eksisterer en nøkkelverdikartlegging

På samme måte, hvis vi vil sjekke om et kart inneholder en kartlegging for et bestemt nøkkel- og verdipar, kan vi bruke inneholder kartlegging metode:

assertThat (map.containsMapping ("fruits", "orange")). isTrue ();

6.4. Sjekk om et kart er tomt

For å sjekke om et kart ikke inneholder noen nøkkelverditilordninger i det hele tatt, kan vi bruke er tom metode:

assertThat (map.isEmpty ()). er falske;

6.5. Sjekk størrelsen på et kart

Til slutt kan vi bruke størrelse metode for å få den totale størrelsen på kartet. Når et kart har nøkler med flere verdier, er den totale størrelsen på kartet tellingen av alle verdiene fra alle tastene:

assertEquals (4, map.size ());

7. Implementeringer

Apache Commons Collections Library gir også flere implementeringer av dette grensesnittet. La oss se på dem.

7.1. ArrayListValuedHashMap

An ArrayListValuedHashMap bruker en ArrayList internt for lagring av verdiene som er knyttet til hver nøkkel, så det tillater dupliserte nøkkelverdipar:

MultiValuedMap-kart = nytt ArrayListValuedHashMap (); map.put ("frukt", "eple"); map.put ("frukt", "oransje"); map.put ("frukt", "oransje"); assertThat ((Collection) map.get ("fruits")) .containsExactly ("apple", "orange", "orange");

Nå er det verdt å merke seg at dette klasse er ikke trådsikker. Derfor, hvis vi vil bruke dette kartet fra flere tråder, må vi være sikre på å bruke riktig synkronisering.

7.2. HashSetValuedHashMap

EN HashSetValuedHashMap bruker en HashSet for lagring av verdiene for hver gitt nøkkel. Derfor, det tillater ikke dupliserte nøkkelverdipar.

La oss se et raskt eksempel, der vi legger til den samme nøkkelverdikartleggingen to ganger:

MultiValuedMap-kart = nytt HashSetValuedHashMap (); map.put ("frukt", "eple"); map.put ("frukt", "eple"); assertThat ((Collection) map.get ("fruits")) .containsExactly ("apple");

Legg merke til hvordan, i motsetning til vårt forrige eksempel som ble brukt ArrayListValuedHashMap, de HashSetValuedHashMap implementeringen ignorerer duplikatkartleggingen.

De HashSetValuedHashMapklasse er heller ikke trådsikker.

7.3. UnmodifiableMultiValuedMap

De UnmodifiableMultiValuedMap er en dekoratørklasse som er nyttig når vi trenger en uforanderlig forekomst av en MultiValuedMap - det vil si at det ikke skal tillate ytterligere modifikasjoner:

@Test (forventet = UnsupportedOperationException.class) offentlig ugyldig givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException () {MultiValuedMap map = new ArrayListValuedHashMap (); map.put ("frukt", "eple"); map.put ("frukt", "oransje"); MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap (kart); immutableMap.put ("frukt", "banan"); // kaster unntak}

Og igjen er det verdt å merke seg den endringen finalen sette vil resultere i en Ikke-støttetOperationException.

8. Konklusjon

Vi har sett forskjellige metoder for MultiValuedMap grensesnitt fra Apache Commons Collections-biblioteket. I tillegg har vi utforsket noen populære implementeringer.

Og som alltid er hele kildekoden tilgjengelig på Github.


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