Gids voor Apache Commons MultiValuedMap

1. Overzicht

In deze korte tutorial bekijken we de MultiValuedMap interface voorzien in de Apache Commons Collections-bibliotheek.

MultiValuedMap biedt een eenvoudige API voor het toewijzen van elke sleutel aan een verzameling waarden in Java. Het is de opvolger van org.apache.commons.collections4.MultiMap, die werd afgeschaft in Commons Collection 4.1.

2. Maven Afhankelijkheid

Voor Maven-projecten moeten we het commons-collecties4 afhankelijkheid:

 org.apache.commons commons-collections4 4.2 

3. Elementen toevoegen aan een MultiValuedMap

We kunnen elementen toevoegen met de leggen en zet alle methoden.

Laten we beginnen met het maken van een instantie van MultiValuedMap:

MultiValuedMap map = nieuwe ArrayListValuedHashMap ();

Laten we vervolgens kijken hoe we elementen een voor een kunnen toevoegen met de leggen methode:

map.put ("fruit", "appel"); map.put ("fruit", "oranje");

Laten we daarnaast enkele elementen toevoegen met de zet alle methode, die een sleutel toewijst aan meerdere elementen in één aanroep:

map.putAll ("voertuigen", Arrays.asList ("auto", "fiets")); assertThat ((Verzameling) map.get ("voertuigen")) .containsExactly ("auto", "fiets");

4. Elementen ophalen uit een MultiValuedMap

MultiValuedMap biedt methoden om sleutels, waarden en sleutelwaarde-toewijzingen op te halen. Laten we ze allemaal eens bekijken.

4.1. Krijg alle waarden van een sleutel

Om alle waarden te krijgen die aan een sleutel zijn gekoppeld, kunnen we de krijgen methode, die een Verzameling:

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

4.2. Haal alle sleutelwaarde-toewijzingen op

Of we kunnen de inzendingen methode om een Verzameling van alle sleutelwaarde-toewijzingen in de kaart:

Verzameling inzendingen = map.entries ();

4.3. Verkrijg alle sleutels

Er zijn twee methoden om alle sleutels in een MultiValuedMap.

Laten we de sleutels methode om een MultiSet zicht op de toetsen:

MultiSet-toetsen = map.keys (); assertThat (sleutels) .contains ("fruits", "vehicles");

Als alternatief kunnen we een Set weergave van de toetsen met behulp van de sleutelbos methode:

Stel sleutels in = map.keySet (); assertThat (sleutels) .contains ("fruits", "vehicles");

4.4. Krijg alle waarden van een kaart

Eindelijk, als we een Verzameling weergave van alle waarden op de kaart, kunnen we de waarden methode:

Verzamelingswaarden = map.values ​​(); assertThat (waarden) .contains ("appel", "oranje", "auto", "fiets");

5. Elementen verwijderen uit een MultiValuedMap

Laten we nu eens kijken naar alle methoden voor het verwijderen van elementen en sleutelwaarde-toewijzingen.

5.1. Verwijder alle elementen die aan een sleutel zijn toegewezen

Laten we eerst eens kijken hoe we alle waarden die aan een opgegeven sleutel zijn gekoppeld, kunnen verwijderen met behulp van de verwijderen methode:

Collectie verwijderdValues ​​= map.remove ("fruit"); assertThat (map.containsKey ("fruit")). isFalse (); assertThat (verwijderdValues) .contains ("appel", "sinaasappel");

Deze methode retourneert een Verzameling weergave van de verwijderde waarden.

5.2. Verwijder een enkele sleutel / waardetoewijzing

Stel nu dat we een sleutel hebben die is toegewezen aan meerdere waarden, maar dat we slechts één van de toegewezen waarden willen verwijderen en de andere willen laten. We kunnen dit eenvoudig doen met behulp van de removeMapping methode:

boolean isRemoved = map.removeMapping ("fruits", "apple"); assertThat (map.containsMapping ("fruits", "apple")). isFalse ();

5.3. Verwijder alle sleutelwaarde-toewijzingen

En tot slot kunnen we de Doorzichtig methode om alle toewijzingen van de kaart te verwijderen:

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

6. Controle Elementen uit een MultiValuedMap

Laten we vervolgens de verschillende methoden bekijken om te controleren of een opgegeven sleutel of waarde op onze kaart bestaat.

6.1. Controleer of er een sleutel bestaat

Om erachter te komen of onze kaart een afbeelding voor een bepaalde sleutel bevat, kunnen we de bevatKey methode:

assertThat (map.containsKey ("voertuigen")). isTrue ();

6.2. Controleer of er een waarde bestaat

Stel vervolgens dat we willen controleren of ten minste één sleutel in onze kaart een afbeelding voor een bepaalde waarde bevat. We kunnen dit doen met behulp van de bevatValue methode:

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

6.3. Controleer of er een sleutel / waardetoewijzing bestaat

Evenzo, als we willen controleren of een kaart een afbeelding bevat voor een specifiek sleutel- en waardepaar, kunnen we de bevatMapping methode:

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

6.4. Controleer of een kaart leeg is

Om te controleren of een kaart helemaal geen sleutel / waarde-toewijzingen bevat, kunnen we de is leeg methode:

assertThat (map.isEmpty ()). isFalse;

6.5. Controleer de grootte van een kaart

Ten slotte kunnen we de grootte methode om de totale grootte van de kaart te krijgen. Als een kaart sleutels heeft met meerdere waarden, dan is de totale grootte van de kaart de telling van alle waarden van alle sleutels:

assertEquals (4, map.size ());

7. Implementaties

De Apache Commons Collections Library biedt ook meerdere implementaties van deze interface. Laten we ze eens bekijken.

7.1. ArrayListValuedHashMap

Een ArrayListValuedHashMap gebruikt een ArrayList intern voor het opslaan van de waarden die bij elke sleutel horen, dus het staat dubbele sleutel / waarde-paren toe:

MultiValuedMap map = nieuwe ArrayListValuedHashMap (); map.put ("fruit", "appel"); map.put ("fruit", "oranje"); map.put ("fruit", "oranje"); assertThat ((Verzameling) map.get ("fruits")) .containsExactly ("apple", "orange", "orange");

Nu, het is vermeldenswaard dat dit class is niet thread-safe. Daarom, als we deze kaart van meerdere threads willen gebruiken, moeten we ervoor zorgen dat we de juiste synchronisatie gebruiken.

7.2. HashSetValuedHashMap

EEN HashSetValuedHashMap gebruikt een HashSet voor het opslaan van de waarden voor elke gegeven sleutel. Daarom het staat geen dubbele sleutel / waarde-paren toe.

Laten we een snel voorbeeld bekijken, waarbij we dezelfde sleutel / waardetoewijzing twee keer toevoegen:

MultiValuedMap-kaart = nieuwe HashSetValuedHashMap (); map.put ("fruit", "appel"); map.put ("fruit", "appel"); assertThat ((Verzameling) map.get ("fruit")) .containsExactly ("appel");

Merk op hoe, in tegenstelling tot ons vorige voorbeeld dat werd gebruikt ArrayListValuedHashMap, de HashSetValuedHashMap implementatie negeert de dubbele toewijzing.

De HashSetValuedHashMapclass is ook niet thread-safe.

7.3. UnmodifiableMultiValuedMap

De UnmodifiableMultiValuedMap is een decorateurklasse die handig is wanneer we een onveranderlijke instantie van een MultiValuedMap - dat wil zeggen, het zou geen verdere wijzigingen mogen toelaten:

@Test (verwacht = UnsupportedOperationException.class) public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException () {MultiValuedMap map = nieuwe ArrayListValuedHashMap (); map.put ("fruit", "appel"); map.put ("fruit", "oranje"); MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap (kaart); immutableMap.put ("fruit", "banaan"); // gooit uitzondering}

En nogmaals, het is vermeldenswaard dat deze wijziging is aangebracht de laatste leggen zal resulteren in een UnsupportedOperationException.

8. Conclusie

We hebben verschillende methoden gezien van de MultiValuedMap interface van de Apache Commons Collections-bibliotheek. Daarnaast hebben we enkele populaire implementaties onderzocht.

En, zoals altijd, is de volledige broncode beschikbaar op Github.


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