MapUtils des collections Apache Commons

Cet article fait partie d'une série: • Apache Commons Collections Bag

• SetUtils des collections Apache Commons

• OrderedMap des collections Apache Commons

• Collections Apache Commons BidiMap

• Un guide sur Apache Commons Collections CollectionUtils

• Apache Commons Collections MapUtils (article actuel) • Guide d'Apache Commons CircularFifoQueue

1. Introduction

MapUtils est l'un des outils disponibles dans le projet Apache Commons Collections.

En termes simples, il fournit des méthodes utilitaires et des décorateurs pour travailler avec les instances java.util.Map et java.util.SortedMap .

2. Configuration

Commençons par ajouter la dépendance:

 org.apache.commons commons-collections4 4.1 

3. Méthodes utilitaires

3.1. Création d'une carte à partir d'un tableau

Maintenant, configurons des tableaux que nous utiliserons pour créer une carte:

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; //... }

Voyons comment nous pouvons créer une carte à partir d'un tableau à deux dimensions:

@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")); }

Nous pourrions également utiliser un tableau unidimensionnel. Dans ce cas, le tableau est traité comme des clés et des valeurs dans des index alternatifs:

@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. Impression du contenu d'une carte

Plusieurs fois lors du débogage ou dans les journaux de débogage, nous aimerions imprimer la carte entière:

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

Et le résultat:

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

Nous pouvons également utiliser debugPrint () qui imprime en plus les types de données des valeurs.

3.3. Obtenir des valeurs

MapUtils fournit des méthodes pour extraire la valeur d'une carte pour une clé donnée de manière sûre et nulle .

Par exemple, getString () obtient une chaîne de la carte . La valeur String est obtenue via toString () . Nous pouvons éventuellement spécifier la valeur par défaut à renvoyer si la valeur est nulle ou si la conversion échoue:

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

Notez que ces méthodes sont null -safe, c'est-à-dire qu'elles peuvent gérer en toute sécurité le paramètre de carte nul :

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

Ici, la couleur prendrait la valeur COLOR_NOT_FOUND même si la carte est nulle .

3.4. Inverser la carte

Nous pouvons également facilement inverser une carte:

@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[] {})); }

Cela inverserait le colorMap en :

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

Si la carte source associe la même valeur pour plusieurs clés, après l'inversion, l'une des valeurs deviendra une clé au hasard.

3.5. Chèques nuls et vides

La méthode isEmpty () renvoie true si une Map est nulle ou vide.

La méthode safeAddToMap () empêche l'ajout d'éléments nuls à un Map.

4. Décorateurs

Ces méthodes ajoutent des fonctionnalités supplémentaires à une carte.

Dans la plupart des cas, il est recommandé de ne pas stocker la référence à la carte décorée .

4.1. Carte à taille fixe

fixedSizeMap () renvoie une carte de taille fixe soutenue par la carte donnée. Les éléments peuvent être modifiés mais pas ajoutés ou supprimés:

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

4.2. Carte prédéfinie

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.

Si une clé transmise à la méthode Map.get (Object) de cette carte n'est pas présente dans la carte, l' instance de Transformer sera utilisée pour créer un nouvel objet qui sera associé à la clé demandée:

@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. Conclusion

Dans ce rapide didacticiel, nous avons exploré la classe MapUtils des collections Apache Commons et nous avons examiné diverses méthodes utilitaires et décorateurs qui peuvent simplifier diverses opérations cartographiques courantes.

Comme d'habitude, le code est disponible sur sur GitHub.

Suivant » Guide de Apache Commons CircularFifoQueue « Précédent Guide des collections Apache Commons CollectionUtils