Vodič za Apache Commons MultiValuedMap

1. Pregled

U ovom ćemo brzom vodiču pogledati MultiValuedMap sučelje osigurano u biblioteci Apache Commons Collections.

MultiValuedMap pruža jednostavan API za mapiranje svakog ključa u zbirku vrijednosti u Javi. To je nasljednik org.apache.commons.collections4.MultiMap, koja je zastarjela u zbirci Commons 4.1.

2. Ovisnost Mavena

Za Maven projekte moramo dodati zajedničke zbirke4 ovisnost:

 org.apache.commons commons-collection4 4.2 

3. Dodavanje elemenata u a MultiValuedMap

Elemente možemo dodavati pomoću staviti i staviSve metode.

Počnimo s izradom instance MultiValuedMap:

Karta MultiValuedMap = novi ArrayListValuedHashMap ();

Dalje, pogledajmo kako možemo dodavati elemente jedan po jedan pomoću staviti metoda:

map.put ("voće", "jabuka"); map.put ("voće", "naranča");

Uz to, dodajmo neke elemente pomoću staviSve metoda koja preslikava ključ za više elemenata u jednom pozivu:

map.putAll ("vozila", Arrays.asList ("automobil", "bicikl")); assertThat ((Zbirka) map.get ("vozila")) .containsExactly ("auto", "bike");

4. Dohvaćanje elemenata iz a MultiValuedMap

MultiValuedMap pruža metode za dohvaćanje ključeva, vrijednosti i preslikavanja ključ / vrijednost. Pogledajmo svaku od njih.

4.1. Dohvatite sve vrijednosti ključa

Da bismo dobili sve vrijednosti povezane s ključem, možemo koristiti dobiti metoda koja vraća a Kolekcija:

assertThat ((Zbirka) map.get ("voće")) .containsExactly ("apple", "orange");

4.2. Nabavite sva mapiranja ključ / vrijednost

Ili, možemo koristiti unosi metoda za dobivanje a Kolekcija svih mapiranja ključ / vrijednost sadržanih na karti:

Kolekcija unosi = map.entries ();

4.3. Uzmi sve ključeve

Postoje dvije metode za dohvaćanje svih ključeva sadržanih u MultiValuedMap.

Iskoristimo tipke metoda za dobivanje a MultiSet pogled tipki:

Tipke MultiSet = map.keys (); assertThat (ključevi) .contens ("voće", "vozila");

Alternativno, možemo dobiti Postavi prikaz tipki pomoću keySet metoda:

Postavi tipke = map.keySet (); assertThat (ključevi) .contens ("voće", "vozila");

4.4. Dohvatite sve vrijednosti karte

Napokon, ako želimo dobiti a Kolekcija pogled svih vrijednosti sadržanih na karti, možemo koristiti vrijednosti metoda:

Vrijednosti zbirke = map.values ​​(); assertThat (values) .contens ("apple", "orange", "car", "bike");

5. Uklanjanje elemenata iz a MultiValuedMap

Pogledajmo sada sve metode za uklanjanje elemenata i preslikavanja ključ / vrijednost.

5.1. Uklonite sve elemente preslikane u ključ

Prvo, pogledajmo kako ukloniti sve vrijednosti povezane s navedenim ključem pomoću ukloniti metoda:

Zbirka removeValues ​​= map.remove ("voće"); assertThat (map.containsKey ("voće")). isFalse (); assertThat (removedValues) .contens ("apple", "orange");

Ova metoda vraća a Kolekcija pogled uklonjenih vrijednosti.

5.2. Uklonite jedno mapiranje ključ / vrijednost

Sada, pretpostavimo da imamo ključ preslikan na više vrijednosti, ali želimo ukloniti samo jednu od preslikanih vrijednosti, a ostale ćemo ostaviti. To možemo lako učiniti pomoću removeMapping metoda:

boolean isRemoved = map.removeMapping ("voće", "jabuka"); assertThat (map.contensMapping ("voće", "jabuka")). isFalse ();

5.3. Uklonite sva mapiranja ključ / vrijednost

I na kraju, možemo koristiti čisto način uklanjanja svih preslikavanja s karte:

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

6. Provjeravanje Elementi iz a MultiValuedMap

Dalje, pogledajmo razne metode za provjeru postoji li navedeni ključ ili vrijednost na našoj mapi.

6.1. Provjerite postoji li ključ

Da bismo saznali sadrži li naša karta mapiranje određenog ključa, možemo koristiti sadržiKljuč metoda:

assertThat (map.containsKey ("vozila")). isTee ();

6.2. Provjerite postoji li vrijednost

Dalje, pretpostavimo da želimo provjeriti sadrži li barem jedan ključ na našoj karti mapiranje za određenu vrijednost. To možemo učiniti pomoću sadržiVrijednost metoda:

assertThat (map.containsValue ("narančasta")). isTrue ();

6.3. Provjerite postoji li mapiranje vrijednosti ključ / vrijednost

Slično tome, ako želimo provjeriti sadrži li karta mapiranje za određeni par ključeva i vrijednosti, možemo koristiti sadržiMapiranje metoda:

assertThat (map.contensMapping ("voće", "narančasto")). isTrue ();

6.4. Provjerite je li karta prazna

Da bismo provjerili sadrži li karta uopće preslikavanja ključ / vrijednost, možemo koristiti prazno je metoda:

assertThat (map.isEmpty ()). isFalse;

6.5. Provjerite veličinu karte

Napokon, možemo koristiti veličina metoda za dobivanje ukupne veličine karte. Kada karta ima ključeve s više vrijednosti, tada je ukupna veličina karte broj svih vrijednosti iz svih ključeva:

assertEquals (4, map.size ());

7. Provedbe

Biblioteka Apache Commons Collections također nudi višestruke implementacije ovog sučelja. Pogledajmo ih.

7.1. ArrayListValuedHashMap

An ArrayListValuedHashMap koristi an ArrayList interno za pohranu vrijednosti pridruženih svakom ključu, dakle omogućuje duplicirane parove ključ / vrijednost:

Karta MultiValuedMap = novi ArrayListValuedHashMap (); map.put ("voće", "jabuka"); map.put ("voće", "naranča"); map.put ("voće", "naranča"); assertThat ((Zbirka) map.get ("voće")) .containsExactly ("jabuka", "naranča", "naranča");

Sada je vrijedno napomenuti da ovo klasa nije zaštićena niti. Stoga, ako želimo koristiti ovu kartu iz više niti, moramo biti sigurni da koristimo ispravnu sinkronizaciju.

7.2. HashSetValuedHashMap

A HashSetValuedHashMap koristi a HashSet za pohranu vrijednosti za svaki zadani ključ. Stoga, ne dopušta duplicirane parove ključ / vrijednost.

Pogledajmo brzi primjer, gdje dva puta dodajemo isto mapiranje ključ / vrijednost:

Karta MultiValuedMap = novi HashSetValuedHashMap (); map.put ("voće", "jabuka"); map.put ("voće", "jabuka"); assertThat ((Zbirka) map.get ("voće")) .containsExactly ("jabuka");

Primijetite kako, za razliku od našeg prethodnog primjera koji se koristio ArrayListValuedHashMap, the HashSetValuedHashMap implementacija zanemaruje dvostruko mapiranje.

The HashSetValuedHashMapklasa također nije zaštićena nitima.

7.3. NemodificiranaMultiValuedMap

The NemodificiranaMultiValuedMap je klasa dekoratora korisna kada nam treba nepromjenjiva instanca a MultiValuedMap - to jest, ne bi trebao dopustiti daljnje izmjene:

@Test (očekuje se = UnsupportedOperationException.class) javna praznina givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException () {MultiValuedMap map = new ArrayListValuedHashMap (); map.put ("voće", "jabuka"); map.put ("voće", "naranča"); MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap (karta); immutableMap.put ("voće", "banana"); // baca iznimku}

I opet, vrijedi napomenuti tu izmjenu konačni staviti rezultirat će UnsupportedOperationException.

8. Zaključak

Vidjeli smo razne metode MultiValuedMap sučelje iz biblioteke Apache Commons Collections. Osim toga, istražili smo nekoliko popularnih implementacija.

Kao i uvijek, puni izvorni kod dostupan je na Githubu.


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