Apache Commons MultiValuedMapのガイド

1. 概要

このクイックチュートリアルでは、https://commons.apache.org/proper/commons-collections/apidocs/index.html?org / apache / commons / collections4 / MultiValuedMap.html [_MultiValuedMap_]インターフェースをご覧ください。 Apache Commons Collections library__で提供されています。 __
  • _ MultiValuedMap_は、各キーをJavaの値のコレクションにマッピングするためのシンプルなAPIを提供します。 **これは、httphttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiMap.html [org.apache.commons.collections4.MultiMap]の継承者であり、which廃止されましたCommons Collection 4.1で。

2. Mavenの依存関係

Mavenプロジェクトの場合、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-collections4%を追加する必要があります22 [_commons-collections4_]依存関係:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.2</version>
</dependency>

*3. MultiValuedMap *への要素の追加

_put_および_putAll_メソッドを使用して要素を追加できます。
_MultiValuedMap_のインスタンスを作成することから始めましょう:
MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();
次に、_put_メソッドを使用して要素を1つずつ追加する方法を見てみましょう。
map.put("fruits", "apple");
map.put("fruits", "orange");
さらに、単一の呼び出しでキーを複数の要素にマッピングする_putAll_メソッドを使用して、いくつかの要素を追加しましょう。
map.putAll("vehicles", Arrays.asList("car", "bike"));
assertThat((Collection<String>) map.get("vehicles"))
  .containsExactly("car", "bike");

*4.  a MultiValuedMap *から要素を取得する

_MultiValuedMap_は、キー、値、およびキーと値のマッピングを取得するメソッドを提供します。 それらのそれぞれを見てみましょう。

4.1。 キーのすべての値を取得する

キーに関連付けられているすべての値を取得するには、__ get __methodを使用して、https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html [_Collection_]を返します。
assertThat((Collection<String>) map.get("fruits"))
  .containsExactly("apple", "orange");

4.2. すべてのキーと値のマッピングを取得

または、_entries_メソッドを使用して、マップに含まれるすべてのキーと値のマッピングのhttps://docs.oracle.com/javase/8/docs/api/java/util/Collection.html[_Collection_]を取得できます。
Collection<Map.Entry<String, String>> entries = map.entries();

4.3. すべてのキーを取得

a _MultiValuedMap._に含まれるすべてのキーを取得するには、2つの方法があります。
_keys_メソッドを使用して、キーのhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiSet.html[_MultiSet_]ビューを取得しましょう。
MultiSet<String> keys = map.keys();
assertThat(keys).contains("fruits", "vehicles");
または、__ keySet __methodを使用して、キーのhttps://docs.oracle.com/javase/8/docs/api/java/util/Set.html[_Set_]ビューを取得できます。
Set<String> keys = map.keySet();
assertThat(keys).contains("fruits", "vehicles");

4.4. マップのすべての値を取得

最後に、マップに含まれるすべての値のhttps://docs.oracle.com/javase/8/docs/api/java/util/Collection.html[_Collection_]ビューを取得する場合は、__ valuesを使用できます。 __方法:
Collection<String> values = map.values();
assertThat(values).contains("apple", "orange", "car", "bike");

*5.  a MultiValuedMap *から要素を削除する

次に、要素とキーと値のマッピングを削除するためのすべてのメソッドを見てみましょう。

5.1. キーにマッピングされたすべての要素を削除する

まず、__ remove ___methodを使用して、指定したキーに関連付けられているすべての値を削除する方法を見てみましょう。
Collection<String> removedValues = map.remove("fruits");
assertThat(map.containsKey("fruits")).isFalse();
assertThat(removedValues).contains("apple", "orange");
このメソッドは、削除された値のhttps://docs.oracle.com/javase/8/docs/api/java/util/Collection.html[_Collection_]ビューを返します。

5.2. 単一のキーと値のマッピングを削除する

ここで、複数の値にマップされたキーがあるが、マップされた値の1つのみを削除し、他の値は残したいとします。 __removeMapping ___methodを使用して簡単にこれを行うことができます。
boolean isRemoved = map.removeMapping("fruits","apple");
assertThat(map.containsMapping("fruits","apple")).isFalse();

5.3. すべてのキーと値のマッピングを削除する

最後に、__clear __methodを使用して、マップからすべてのマッピングを削除できます。
map.clear();
assertThat(map.isEmpty()).isTrue();

*6. MultiValuedMap *から要素を確認する

次に、指定されたキーまたは値がマップに存在するかどうかを確認するためのさまざまな方法を見てみましょう。

6.1. キーが存在するかどうかを確認する

マップに指定されたキーのマッピングが含まれているかどうかを確認するには、_containsKey_メソッドを使用できます。
assertThat(map.containsKey("vehicles")).isTrue();

6.2. 値が存在するかどうかを確認する

次に、マップ内の少なくとも1つのキーに特定の値のマッピングが含まれているかどうかを確認するとします。 これを行うには、_containsValue_メソッドを使用します。
assertThat(map.containsValue("orange")).isTrue();

6.3. キーと値のマッピングが存在するかどうかを確認します

同様に、「マップ」に特定のキーと値のペアのマッピングが含まれているかどうかを確認する場合は、「_ containsMapping_」メソッドを使用できます。
assertThat(map.containsMapping("fruits","orange")).isTrue();

6.4. マップが空かどうかを確認する

マップにキーと値のマッピングがまったく含まれていないかどうかを確認するには、_isEmpty_メソッドを使用できます。
assertThat(map.isEmpty()).isFalse;

6.5. 地図のサイズを確認する

最後に、_size_メソッドを使用して、マップの合計サイズを取得できます。 マップに複数の値を持つキーがある場合、マップの合計サイズはすべてのキーのすべての値のカウントになります。
assertEquals(4, map.size());

7. 実装

Apache Commons Collections Libraryは、このインターフェースの複数の実装も提供します。 それらを見てみましょう。

7.1. ArrayListValuedHashMap

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/multimap/ArrayListValuedHashMap.html[_ArrayListValuedHashMap_]は、各キーに関連付けられた値を内部的に保存するために_ArrayList_を使用するため、*重複するキーと値のペアを許可します*:
MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();
map.put("fruits", "apple");
map.put("fruits", "orange");
map.put("fruits", "orange");
assertThat((Collection<String>) map.get("fruits"))
  .containsExactly("apple", "orange", "orange");
さて、この*クラスはスレッドセーフではありません*。 したがって、このマップを複数のスレッドから使​​用する場合は、適切な同期を使用する必要があります。

7.2. HashSetValuedHashMap

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/multimap/HashSetValuedHashMap.html[_HashSetValuedHashMap_]は、指定された各キーの値を保存するために_HashSet_を使用します。 したがって、*キーと値のペアを重複させることはできません*。
同じキーと値のマッピングを2回追加する簡単な例を見てみましょう。
MultiValuedMap<String, String> map = new HashSetValuedHashMap<>();
map.put("fruits", "apple");
map.put("fruits", "apple");
assertThat((Collection<String>) map.get("fruits"))
  .containsExactly("apple");
__ArrayListValuedHashMapを使用した前の例とは異なり、___ HashSetValuedHashMap_実装は重複マッピングを無視することに注意してください。
_HashSetValuedHashMap_ *クラスもスレッドセーフではありません*。

7.3. UnmodifiableMultiValuedMap

_UnmodifiableMultiValuedMap_は、https://commons.apache.org/proper/commons-collections/apidocs/index.html?org/apache/commons/collections4/MultiValuedMap.htmlの不変インスタンスが必要な場合に役立つデコレータークラスです。 [_MultiValuedMap_] –つまり、それ以上の変更は許可されません。
@Test(expected = UnsupportedOperationException.class)
public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() {
    MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();
    map.put("fruits", "apple");
    map.put("fruits", "orange");
    MultiValuedMap<String, String> immutableMap =
      MultiMapUtils.unmodifiableMultiValuedMap(map);
    immutableMap.put("fruits", "banana"); // throws exception
}
繰り返しますが、*最後の_put_を変更すると、_UnsupportedOperationException_が発生することに注意してください。*

8. 結論

Apache Commons Collectionsライブラリの_MultiValuedMap_インターフェースのさまざまなメソッドを見てきました。 さらに、いくつかの一般的な実装を調査しました。
そして、いつものように、完全なソースコードが利用可能ですhttps://github.com/eugenp/tutorials/tree/master/java-collections-maps[Github上]。