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.