Apache Commons Collections MapUtils
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]から入手できます。
次
”
https://www.baeldung.com/commons-circular-fifo-queue【Apache
CommonsガイドCircularFifoQueue】
-
«** 前へ