Collezioni Apache Commons MapUtils

Questo articolo fa parte di una serie: • Apache Commons Collections Bag

• SetUtils delle raccolte di Apache Commons

• Mappa ordinata delle collezioni di Apache Commons

• BidiMap delle collezioni Apache Commons

• Una guida alle collezioni di Apache Commons CollectionUtils

• MapUtils delle raccolte di Apache Commons (articolo corrente) • Guida ad Apache Commons CircularFifoQueue

1. Introduzione

MapUtils è uno degli strumenti disponibili nel progetto Apache Commons Collections.

In poche parole, fornisce metodi di utilità e decoratori per lavorare con le istanze java.util.Map e java.util.SortedMap .

2. Configurazione

Cominciamo aggiungendo la dipendenza:

 org.apache.commons commons-collections4 4.1 

3. Metodi di utilità

3.1. Creazione di una mappa da un array

Ora, configuriamo gli array che useremo per creare una mappa:

public class MapUtilsTest { private String[][] color2DArray = new String[][] { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} }; private String[] color1DArray = new String[] { "RED", "#FF0000", "GREEN", "#00FF00", "BLUE", "#0000FF" }; private Map colorMap; //... }

Vediamo come possiamo creare una mappa da un array bidimensionale:

@Test public void whenCreateMapFrom2DArray_theMapIsCreated() { this.colorMap = MapUtils.putAll( new 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")); }

Potremmo anche usare una matrice unidimensionale. In tal caso, l'array viene trattato come chiavi e valori in indici alternativi:

@Test public void whenCreateMapFrom1DArray_theMapIsCreated() { this.colorMap = MapUtils.putAll( new 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. Stampa del contenuto di una mappa

Molte volte durante il debug o nei log di debug, vorremmo stampare l'intera mappa:

@Test public void whenVerbosePrintMap_thenMustPrintFormattedMap() { MapUtils.verbosePrint(System.out, "Optional Label", this.colorMap); }

E il risultato:

Optional Label = { RED = #FF0000 BLUE = #0000FF GREEN = #00FF00 }

Possiamo anche usare debugPrint () che stampa in aggiunta i tipi di dati dei valori.

3.3. Ottenere valori

MapUtils fornisce alcuni metodi per estrarre il valore da una mappa per una determinata chiave in modo null- sicuro.

Ad esempio, getString () ottiene una stringa dalla mappa . Il valore String si ottiene tramite toString () . Facoltativamente, possiamo specificare il valore predefinito da restituire se il valore è nullo o se la conversione non riesce:

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

Si noti che questi metodi sono null -safe, ovvero possono gestire in modo sicuro il parametro null map:

@Test public void whenGetOnNullMap_thenMustReturnDefaultValue() { String defaultColorStr = "COLOR_NOT_FOUND"; String color = MapUtils.getString(null, "RED", defaultColorStr); assertEquals(color, defaultColorStr); }

Qui il colore otterrebbe il valore di COLOR_NOT_FOUND anche se la mappa è nulla .

3.4. Inversione della mappa

Possiamo anche invertire facilmente una mappa:

@Test public void whenInvertMap_thenMustReturnInvertedMap() { Map invColorMap = MapUtils.invertMap(this.colorMap); int size = invColorMap.size(); Assertions.assertThat(invColorMap) .hasSameSizeAs(colorMap) .containsKeys(this.colorMap.values().toArray(new String[] {})) .containsValues(this.colorMap.keySet().toArray(new String[] {})); }

Questo invertirebbe colorMap in :

{ #00FF00 = GREEN #FF0000 = RED #0000FF = BLUE }

Se la mappa sorgente associa lo stesso valore per più chiavi, dopo l'inversione uno dei valori diventerà una chiave in modo casuale.

3.5. Assegni nulli e vuoti

Il metodo isEmpty () restituisce true se una mappa è nulla o vuota.

Il metodo safeAddToMap () impedisce l'aggiunta di elementi nulli a una mappa.

4. Decoratori

Questi metodi aggiungono funzionalità aggiuntive a una mappa.

Nella maggior parte dei casi, è buona norma non memorizzare il riferimento alla Mappa decorata .

4.1. Mappa a dimensione fissa

fixedSizeMap () restituisce una mappa a dimensione fissa supportata dalla mappa data. Gli elementi possono essere modificati ma non aggiunti o rimossi:

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

4.2. Mappa prevista

The predicatedMap() method returns a Map ensures that all held elements match the provided predicate:

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

Here, we specified the predicate for values using PredicateUtils.uniquePredicate(). Any attempt to insert a duplicate value into this map will result in java.lang.IllegalArgumentException.

We can implement custom predicates by implementing the Predicate interface.

4.3. Lazy Map

lazyMap() returns a map where values are initialized when requested.

Se una chiave passata al metodo Map.get (Object) di questa mappa non è presente nella mappa, l' istanza Transformer verrà utilizzata per creare un nuovo oggetto che verrà associato alla chiave richiesta:

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

5. conclusione

In questo breve tutorial, abbiamo esplorato la classe MapUtils delle collezioni di Apache Commons e abbiamo esaminato vari metodi di utilità e decoratori che possono semplificare varie operazioni comuni sulle mappe.

Come al solito, il codice è disponibile su GitHub.

Avanti » Guida ad Apache Commons CircularFifoQueue « Precedente Una guida ad Apache Commons Collezioni CollectionUtils