Sprievodca po Apache Commons MultiValuedMap

1. Prehľad

V tomto rýchlom výučbe sa pozrieme na MultiValuedMap rozhranie poskytované v knižnici Apache Commons Collections.

MultiValuedMap poskytuje jednoduché API na mapovanie každého kľúča na zbierku hodnôt v Jave. Je to jeho nástupca org.apache.commons.collections4.MultiMap, ktorá bola zastaraná v zbierke Commons 4.1.

2. Závislosť od Maven

Pre projekty Maven musíme pridať spoločné zbierky4 závislosť:

 org.apache.commons commons-collections4 4.2 

3. Pridávanie prvkov do a MultiValuedMap

Elementy môžeme pridať pomocou dať a putAll metódy.

Začnime vytvorením inštancie MultiValuedMap:

Mapa MultiValuedMap = nový ArrayListValuedHashMap ();

Ďalej sa pozrime, ako môžeme pomocou prvku pridať jednotlivé prvky dať metóda:

map.put ("ovocie", "jablko"); map.put („ovocie“, „oranžová“);

Okrem toho pridajme niektoré prvky pomocou putAll metóda, ktorá mapuje kľúč na viac prvkov v jednom hovore:

map.putAll ("vehicles", Arrays.asList ("car", "bike")); assertThat ((Zbierka) map.get ("vozidlá")). obsahuje Presne ("auto", "bicykel");

4. Získavanie prvkov z a MultiValuedMap

MultiValuedMap poskytuje metódy na získanie kľúčov, hodnôt a priradení kľúč - hodnota. Pozrime sa na každú z nich.

4.1. Získajte všetky hodnoty kľúča

Ak chcete získať všetky hodnoty spojené s kľúčom, môžeme použiť dostať metóda, ktorá vráti a Zbierka:

assertThat ((Zbierka) map.get ("ovocie")). obsahuje Presne ("jablko", "oranžová");

4.2. Získajte všetky priradenia kľúč - hodnota

Alebo môžeme použiť záznamy metóda na získanie a Zbierka všetkých priradení kľúč - hodnota obsiahnutých na mape:

Zbierka entries = map.entries ();

4.3. Získajte všetky kľúče

Existujú dve metódy na získanie všetkých kľúčov obsiahnutých v a MultiValuedMap.

Použime kľúče metóda na získanie a MultiSet pohľad na klávesy:

Klávesy MultiSet = map.keys (); assertThat (kľúče) .obsahuje ("ovocie", "vozidlá");

Prípadne môžeme získať a Nastaviť pohľad na klávesy pomocou keySet metóda:

Nastaviť klávesy = map.keySet (); assertThat (kľúče) .obsahuje ("ovocie", "vozidlá");

4.4. Získajte všetky hodnoty mapy

Nakoniec, ak chceme získať a Zbierka pohľad na všetky hodnoty obsiahnuté na mape, môžeme použiť hodnoty metóda:

Hodnoty zbierky = map.values ​​(); assertThat (hodnoty) .obsahuje („jablko“, „oranžová“, „auto“, „bicykel“);

5. Odstraňovanie prvkov z a MultiValuedMap

Teraz sa pozrime na všetky metódy odstraňovania prvkov a priradení kľúč - hodnota.

5.1. Odstrániť všetky prvky mapované na kľúč

Najprv sa pozrime, ako odstrániť všetky hodnoty spojené so zadaným kľúčom pomocou klávesu odstrániť metóda:

Zbierka odstránenáHodnoty = map.remove ("ovocie"); assertThat (map.containsKey ("ovocie")). isFalse (); assertThat (odstránenéHodnoty) .obsahuje („jablko“, „oranžová“);

Táto metóda vracia a Zbierka pohľad na odstránené hodnoty.

5.2. Odstráňte mapovanie jedného páru kľúč - hodnota

Teraz predpokladajme, že máme kľúč namapovaný na viac hodnôt, ale chceme odstrániť iba jednu z namapovaných hodnôt a ostatné ponechať. Môžeme to ľahko urobiť pomocou removeMapping metóda:

boolean isRemoved = map.removeMapping ("ovocie", "jablko"); assertThat (map.containsMapping ("ovocie", "jablko")). isFalse ();

5.3. Odstráňte všetky priradenia kľúč - hodnota

A nakoniec môžeme použiť jasný spôsob odstránenia všetkých mapovaní z mapy:

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

6. Kontrola Prvky z a MultiValuedMap

Ďalej sa pozrime na rôzne metódy kontroly, či na našej mape existuje zadaný kľúč alebo hodnota.

6.1. Skontrolujte, či kľúč existuje

Na zistenie, či naša mapa obsahuje mapovanie pre zadaný kľúč, môžeme použiť containsKey metóda:

assertThat (map.containsKey ("vozidlá")). isTrue ();

6.2. Skontrolujte, či hodnota existuje

Ďalej predpokladajme, že chceme skontrolovať, či aspoň jeden kľúč na našej mape obsahuje mapovanie konkrétnej hodnoty. Môžeme to urobiť pomocou containsValue metóda:

assertThat (map.containsValue ("oranžová")). isTrue ();

6.3. Skontrolujte, či existuje mapovanie kľúč - hodnota

Podobne, ak chceme skontrolovať, či mapa obsahuje mapovanie pre konkrétny pár kľúčov a hodnôt, môžeme použiť znak containsMapping metóda:

assertThat (map.containsMapping ("ovocie", "oranžová")). isTrue ();

6.4. Skontrolujte, či je mapa prázdna

Na kontrolu, či mapa neobsahuje vôbec žiadne priradenia kľúč - hodnota, môžeme použiť je prázdny metóda:

assertThat (map.isEmpty ()). isFalse;

6.5. Skontrolujte veľkosť mapy

Nakoniec môžeme použiť veľkosť metóda na získanie celkovej veľkosti mapy. Ak má mapa kľúče s viacerými hodnotami, potom celková veľkosť mapy predstavuje počet všetkých hodnôt zo všetkých kľúčov:

assertEquals (4, map.size ());

7. Implementácie

Knižnica zbierok Apache Commons taktiež poskytuje viaceré implementácie tohto rozhrania. Poďme sa na ne pozrieť.

7.1. ArrayListValuedHashMap

An ArrayListValuedHashMap používa ArrayList interne na ukladanie hodnôt spojených s každým kľúčom, takže umožňuje duplicitné páry kľúč - hodnota:

Mapa MultiValuedMap = nový ArrayListValuedHashMap (); map.put ("ovocie", "jablko"); map.put („ovocie“, „oranžová“); map.put („ovocie“, „oranžová“); assertThat ((Zbierka) map.get ("ovocie")). obsahuje Presne ("jablko", "oranžová", "oranžová");

Teraz stojí za zmienku, že toto trieda nie je bezpečná pre vlákna. Ak teda chceme túto mapu použiť z viacerých vlákien, musíme si byť istí, že použijeme správnu synchronizáciu.

7.2. HashSetValuedHashMap

A HashSetValuedHashMap používa a HashSet na ukladanie hodnôt pre každý daný kľúč. Preto neumožňuje duplicitné páry kľúč - hodnota.

Pozrime sa na krátky príklad, keď dvakrát pridáme rovnaké mapovanie kľúč - hodnota:

Mapa MultiValuedMap = nová HashSetValuedHashMap (); map.put ("ovocie", "jablko"); map.put ("ovocie", "jablko"); assertThat ((Zbierka) map.get ("ovocie")). obsahuje Presne ("jablko");

Všimnite si, ako na rozdiel od predchádzajúceho použitého príkladu ArrayListValuedHashMap, the HashSetValuedHashMap implementácia ignoruje duplicitné mapovanie.

The HashSetValuedHashMaptrieda tiež nie je bezpečná pre vlákna.

7.3. UnmodifiableMultiValuedMap

The UnmodifiableMultiValuedMap je trieda dekoratérov, ktorá je užitočná, keď potrebujeme nemennú inštanciu a MultiValuedMap - to znamená, že by nemalo umožňovať ďalšie úpravy:

@Test (očakáva sa = UnsupportedOperationException.class) public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException () {MultiValuedMap mapa = nový ArrayListValuedHashMap (); map.put ("ovocie", "jablko"); map.put („ovocie“, „oranžová“); MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap (mapa); immutableMap.put ("ovocie", "banán"); // hodí výnimku}

Opäť stojí za zmienku, že došlo k zmene finálny dať bude mať za následok UnsupportedOperationException.

8. Záver

Videli sme rôzne metódy MultiValuedMap rozhranie z knižnice Apache Commons Collections. Okrem toho sme preskúmali niekoľko populárnych implementácií.

Celý zdrojový kód je ako vždy k dispozícii na stránkach Github.


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