Apache Commons Collections MapUtils

Apache Commons-Sammlungen MapUtils

1. Einführung

MapUtils ist eines der Tools, die im Apache Commons Collections-Projekt verfügbar sind.

Einfach ausgedrückt, bietet es Dienstprogrammmethoden und Dekoratoren für die Arbeit mitjava.util.Map undjava.util.SortedMap Instanzen.

2. Konfiguration

Beginnen wir mit dem Hinzufügen vonthe dependency:


    org.apache.commons
    commons-collections4
    4.1

3. Dienstprogrammmethoden

3.1. Erstellen einesMap aus einemArray

Richten wir nun Arrays ein, die wir zum Erstellen einer Karte verwenden:

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;

    //...
}

Mal sehen, wie wir eine Karte aus einem zweidimensionalen Array erstellen können:

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

Wir könnten auch ein eindimensionales Array verwenden. In diesem Fall wird das Array als Schlüssel und Werte in alternativen Indizes behandelt:

@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. Drucken des Inhalts vonMap

Während des Debuggens oder in Debug-Protokollen möchten wir oft die gesamte Karte drucken:

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

Und das Ergebnis:

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

Wir können auchdebugPrint() verwenden, die zusätzlich die Datentypen der Werte drucken.

3.3. Werte bekommen

MapUtils bietet einige Methoden zum Extrahieren von Werten aus einer Karte für einen bestimmten Schlüssel aufnull-sichere Weise.

Zum Beispiel erhältgetString() einString vonMap. Der Wert vonString wird übertoString() erhalten. Optional können Sie den Standardwert angeben, der zurückgegeben werden soll, wenn der Wertnull beträgt oder wenn die Konvertierung fehlschlägt:

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

    assertEquals(color, defaultColorStr);
}

Es ist zu beachten, dass diese Verfahrennull-sicher sind, d.h. Sie können den Kartenparameternullicher verarbeiten:

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

    assertEquals(color, defaultColorStr);
}

Hier würdecolor den Wert alsCOLOR_NOT_FOUND erhalten, obwohl die Kartenull ist.

3.4. Invertieren derMap

Wir können eine Karte auch leicht umkehren:

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

Dies würdecolorMap in: invertieren

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

Wenn die Quellenzuordnung denselben Wert für mehrere Schlüssel verknüpft, wird einer der Werte nach der Inversion zufällig zu einem Schlüssel.

3.5. Null and Empty Checks

Die MethodeisEmpty() gibttrue zurück, wennMapnull ist oder leer ist.

Die MethodesafeAddToMap() verhindert das Hinzufügen von Nullelementen zuMap.

4. Dekorateure

Diese Methoden fügenMap. zusätzliche Funktionen hinzu

In den meisten Fällen empfiehlt es sich, den Verweis auf die dekorierten Map. nicht zu speichern

4.1. Feste GrößeMap

fixedSizeMap() gibt eine Karte mit fester Größe zurück, die von der angegebenen Karte unterstützt wird. Elemente können geändert, aber nicht hinzugefügt oder entfernt werden:

@Test(expected = IllegalArgumentException.class)
public void whenCreateFixedSizedMapAndAdd_thenMustThrowException() {
    Map rgbMap = MapUtils
      .fixedSizeMap(MapUtils.putAll(new HashMap<>(), this.color1DArray));

    rgbMap.put("ORANGE", "#FFA500");
}

4.2. PrädizierteMap

Die MethodepredicatedMap() gibtMap zurück und stellt sicher, dass alle gehaltenen Elemente mit dem angegebenen Prädikat übereinstimmen:

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

    uniqValuesMap.put("NEW_RED", "#FF0000");
}

Hier haben wir das Prädikat für Werte mitPredicateUtils.uniquePredicate() angegeben. Jeder Versuch, einen doppelten Wert in diese Karte einzufügen, führt zujava.lang.IllegalArgumentException.

Wir können benutzerdefinierte Prädikate implementieren, indem wir diePredicate-Schnittstelle implementieren.

4.3. LazyMap

lazyMap() gibt eine Karte zurück, in der Werte auf Anfrage initialisiert werden.

Wenn ein Schlüssel, der an dieMap.get(Object)-Methode dieser Karte übergeben wurde, nicht in der Karte vorhanden ist, wird die Instanz vonTransformerverwendet, um ein neues Objekt zu erstellen, das dem angeforderten Schlüssel zugeordnet wird:

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

In diesem kurzen Tutorial haben wir die Klasse Apache Commons CollectionsMapUtilsuntersucht und verschiedene Dienstprogrammmethoden und Dekoratoren untersucht, die verschiedene allgemeine Kartenoperationen vereinfachen können.

Wie üblich ist der Codeover on GitHub verfügbar.