Apache Commons-collecties MapUtils

Dit artikel maakt deel uit van een serie: • Apache Commons Collections Bag

• Apache Commons-verzamelingen SetUtils

• Apache Commons Collections OrderedMap

• Apache Commons-collecties BidiMap

• Een gids voor Apache Commons Collections CollectionUtils

• Apache Commons-collecties MapUtils (huidig ​​artikel) • Gids voor Apache Commons CircularFifoQueue

1. Inleiding

MapUtils is een van de tools die beschikbaar zijn in het Apache Commons Collections-project.

Simpel gezegd, het biedt hulpprogramma's en decorateurs om mee te werken java.util.Map en java.util.SortedMap gevallen.

2. Installatie

Laten we beginnen met het toevoegen van de afhankelijkheid:

 org.apache.commons commons-collections4 4.1 

3. Hulpprogramma's

3.1. Een Kaart van een Array

Laten we nu arrays instellen die we zullen gebruiken om een ​​kaart te maken:

openbare klasse MapUtilsTest {private String [] [] color2DArray = nieuwe String [] [] {{"RED", "# FF0000"}, {"GREEN", "# 00FF00"}, {"BLUE", "# 0000FF" }}; private String [] color1DArray = nieuwe String [] {"RED", "# FF0000", "GREEN", "# 00FF00", "BLUE", "# 0000FF"}; privékaart colorMap; // ...}

Laten we eens kijken hoe we een kaart kunnen maken van een tweedimensionale array:

@Test openbare leegte whenCreateMapFrom2DArray_theMapIsCreated () {this.colorMap = MapUtils.putAll (nieuwe HashMap (), this.color2DArray); assertThat (this.colorMap, is (aMapWithSize (this.color2DArray.length))); assertThat (this.colorMap, hasEntry ("RED", "# FF0000")); assertThat (this.colorMap, hasEntry ("GREEN", "# 00FF00")); assertThat (this.colorMap, hasEntry ("BLUE", "# 0000FF")); }

We zouden ook een eendimensionale array kunnen gebruiken. In dat geval wordt de array behandeld als sleutels en waarden in alternatieve indices:

@Test openbare leegte whenCreateMapFrom1DArray_theMapIsCreated () {this.colorMap = MapUtils.putAll (nieuwe HashMap (), this.color1DArray); assertThat (this.colorMap, is (aMapWithSize (this.color1DArray.length / 2))); assertThat (this.colorMap, hasEntry ("RED", "# FF0000")); assertThat (this.colorMap, hasEntry ("GREEN", "# 00FF00")); assertThat (this.colorMap, hasEntry ("BLUE", "# 0000FF")); }

3.2. De inhoud van een Kaart

Vaak willen we tijdens het debuggen of in foutopsporingslogboeken de hele kaart afdrukken:

@Test openbare leegte whenVerbosePrintMap_thenMustPrintFormattedMap () {MapUtils.verbosePrint (System.out, "Optioneel label", this.colorMap); }

En het resultaat:

Optioneel label = {RED = # FF0000 BLAUW = # 0000FF GROEN = # 00FF00}

We kunnen ook gebruik maken van debugPrint () die bovendien de datatypes van de waarden afdrukt.

3.3. Waarden krijgen

MapUtils biedt enkele methoden voor het extraheren van waarde uit een kaart voor een bepaalde sleutel in een nul-veilige manier.

Bijvoorbeeld, getString () krijgt een Draad van de Kaart. De Draad waarde wordt verkregen via toString (). We kunnen optioneel de standaardwaarde specificeren die moet worden geretourneerd als de waarde dat is nul of als de conversie mislukt:

@Test openbare leegte whenGetKeyNotPresent_thenMustReturnDefaultValue () {String defaultColorStr = "COLOR_NOT_FOUND"; String color = MapUtils .getString (this.colorMap, "BLACK", defaultColorStr); assertEquals (kleur, defaultColorStr); }

Merk op dat deze methoden zijn nul-veilig d.w.z. ze kunnen veilig omgaan met de nul kaartparameter:

@Test openbare ongeldig wanneerGetOnNullMap_thenMustReturnDefaultValue () {String defaultColorStr = "COLOR_NOT_FOUND"; String color = MapUtils.getString (null, "RED", defaultColorStr); assertEquals (kleur, defaultColorStr); }

Hier de kleur zou de waarde krijgen als COLOR_NOT_FOUND ook al is de kaart nul.

3.4. Het omkeren van de Kaart

We kunnen een kaart ook gemakkelijk omkeren:

@Test openbare leegte whenInvertMap_thenMustReturnInvertedMap () {Map invColorMap = MapUtils.invertMap (this.colorMap); int size = invColorMap.size (); Assertions.assertThat (invColorMap) .hasSameSizeAs (colorMap) .containsKeys (this.colorMap.values ​​(). ToArray (nieuwe String [] {})) .containsValues ​​(this.colorMap.keySet (). ToArray (nieuwe String [] { })); }

Dit zou de colorMap naar:

{# 00FF00 = GROEN # FF0000 = ROOD # 0000FF = BLAUW}

Als de bronkaart dezelfde waarde voor meerdere sleutels associeert, wordt na omkering een van de waarden willekeurig een sleutel.

3.5. Nul- en lege cheques

is leeg() methode retourneert waar als een Kaart is nul of leeg.

safeAddToMap () methode voorkomt het toevoegen van null-elementen aan een Kaart.

4. Decorateurs

Deze methoden voegen extra functionaliteit toe aan een Kaart.

In de meeste gevallen is het een goede gewoonte om de verwijzing naar de versierde kaart niet op te slaan.

4.1. Vaste maat Kaart

fixedSizeMap () geeft een kaart met een vaste grootte terug, ondersteund door de gegeven kaart. Elementen kunnen worden gewijzigd, maar niet toegevoegd of verwijderd:

@Test (verwacht = IllegalArgumentException.class) public void whenCreateFixedSizedMapAndAdd_thenMustThrowException () {Map rgbMap = MapUtils .fixedSizeMap (MapUtils.putAll (nieuwe HashMap (), this.color1DArray)); rgbMap.put ("ORANJE", "# FFA500"); }

4.2. Voorspeld Kaart

De predicatedMap () methode retourneert een Kaart zorgt ervoor dat alle vastgehouden elementen overeenkomen met het opgegeven predikaat:

@Test (verwacht = IllegalArgumentException.class) public void whenAddDuplicate_thenThrowException () {Map uniqValuesMap = MapUtils.predicatedMap (this.colorMap, null, PredicateUtils.uniquePredicate ()); uniqValuesMap.put ("NEW_RED", "# FF0000"); }

Hier hebben we het predikaat gespecificeerd voor waarden met PredicateUtils.uniquePredicate (). Elke poging om een ​​dubbele waarde in deze kaart in te voegen, resulteert in java.lang.IllegalArgumentException.

We kunnen aangepaste predicaten implementeren door het Predikaat koppel.

4.3. Lui Kaart

lazyMap () geeft een kaart terug waarin waarden worden geïnitialiseerd wanneer daarom wordt gevraagd.

Als er een sleutel is doorgegeven aan deze kaart Map.get (Object) methode is niet aanwezig in de kaart, de Transformator instantie wordt gebruikt om een ​​nieuw object te maken dat wordt gekoppeld aan de gevraagde sleutel:

@Test openbare leegte whenCreateLazyMap_theMapIsCreated () {Map intStrMap = MapUtils.lazyMap (nieuwe HashMap (), TransformerUtils.stringValueTransformer ()); assertThat (intStrMap, is (anEmptyMap ())); intStrMap.get (1); intStrMap.get (2); intStrMap.get (3); assertThat (intStrMap, is (aMapWithSize (3))); }

5. Conclusie

In deze korte tutorial hebben we de Apache Commons-collecties onderzocht MapUtils class en we hebben gekeken naar verschillende hulpprogramma's en decorateurs die verschillende veelgebruikte kaartbewerkingen kunnen vereenvoudigen.

Zoals gewoonlijk is de code beschikbaar op GitHub.

De volgende » Gids voor Apache Commons CircularFifoQueue « Vorige A Guide to Apache Commons Collections CollectionUtils