1前書き


MapUtils

は、Apache Commons Collectionsプロジェクトで利用可能なツールの1つです。

簡単に言うと、

java.util.Map

および

java.util.SortedMap

インスタンスを処理するためのユーティリティメソッドとデコレータを提供します。


2セットアップ


依存関係

を追加することから始めましょう:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>


3実用的な方法


3.1.

Array


から

Map

を作成する

それでは、マップを作成するために使用する配列を設定しましょう。

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<String, String> colorMap;

   //...
}

2次元配列からマップを作成する方法を見てみましょう。

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

一次元配列を使うこともできます。その場合、配列は代替インデックスのキーと値として扱われます。

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

Map


の内容を印刷する

デバッグ中またはデバッグログ中に何度も、マップ全体を印刷したいです。

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

そしてその結果:

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


debugPrint()

を使用することもできます。これは値のデータ型を追加的に表示します。


3.3. 値を取得する


MapUtils

は、nullから安全な方法で、指定されたキーのマップから値を抽出するためのいくつかのメソッドを提供します。

たとえば、

getString()



Map

から

String

を取得します。

String

値は

toString()

を介して取得されます。値が

null

の場合、または変換が失敗した場合に返されるデフォルト値をオプションで指定できます。

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

    assertEquals(color, defaultColorStr);
}

これらのメソッドは

null

-safeであること、つまり

null

mapパラメータを安全に処理できることに注意してください。

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

    assertEquals(color, defaultColorStr);
}

ここで

map



null

であっても

color



COLOR

NOT

FOUND

として値を取得します。


3.4.

Map


を反転する

地図を簡単に元に戻すこともできます。

@Test
public void whenInvertMap__thenMustReturnInvertedMap() {
    Map<String, String> 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[]{}));
}

これは

colorMap




_に反転するでしょう:

_

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

ソースマップが複数のキーに対して同じ値を関連付ける場合、反転後に値の1つがランダムにキーになります。


3.5. NULLチェックと空チェック


isEmpty()

メソッドは、

Map



null

または空の場合、

true

を返します。


safeAddToMap()

メソッドは、__Mapへのnull要素の追加を防ぎます。


4デコレータ

これらのメソッドは__Mapに追加機能を追加します。

ほとんどの場合、装飾されたMapへの参照を保存しないことをお勧めします


_.

_


4.1. 固定サイズ

Map



fixedSizeMap()

は、指定されたマップを基にした固定サイズのマップを返します。

要素は変更できますが追加や削除はできません。

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

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


4.2. 予測

マップ



predicatedMap()

メソッドは

Map

を返し、保持されているすべての要素が提供された述語と一致することを確認します。

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

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

ここでは、

PredicateUtils.uniquePredicate()

を使用して値の述語を指定しました。このマップに重複する値を挿入しようとすると、

java.lang.IllegalArgumentException

が発生します。


Predicate

インターフェースを実装することでカスタム述語を実装できます。


4.3. 怠惰な

Map



lazyMap()

は、要求時に値が初期化されるマップを返します。

このマップの

Map.get(Object)

メソッドに渡されたキーがマップに存在しない場合は、

Transformer

インスタンスを使用して、要求されたキーに関連付けられる新しいオブジェクトを作成します。

@Test
public void whenCreateLazyMap__theMapIsCreated() {
    Map<Integer, String> 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結論

このクイックチュートリアルでは、Apache Commons Collections

MapUtils

クラスを調べ、さまざまな一般的なマップ操作を単純化できるさまざまなユーティリティメソッドとデコレータを調べました。

いつもどおり、コードはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[over on GitHub]から入手できます。




  • «** 前へ