1. 概要

この記事では、GoogleGuavaライブラリのMap実装の1つであるMultimapについて説明します。 これは、 java.util.Map と同様に、キーを値にマップするコレクションですが、各キーは複数の値に関連付けられている場合があります。

2. Mavenの依存関係

まず、依存関係を追加しましょう。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

最新バージョンはここにあります。

3. マルチマップ実装

Guava Multimap、の場合、同じキーに2つの値を追加しても、2番目の値が最初の値を上書きすることはありません。 代わりに、結果のmapに2つの値が含まれます。 テストケースを見てみましょう:

String key = "a-key";
Multimap<String, String> map = ArrayListMultimap.create();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(2, map.size());

map のコンテンツを印刷すると、次のように出力されます。

{a-key=[firstValue, secondValue]}

キー「a-key」で値を取得すると、次のようになります。 コレクション結果として「firstValue」と「secondValue」が含まれます。

Collection<String> values = map.get(key);

値を出力すると、次のように出力されます。

[firstValue, secondValue]

4. 標準のマップとの比較

java .util パッケージの標準マップでは、同じキーに複数の値を割り当てることはできません。 同じキーを使用してput()2つの値をマップに入れる単純なケースを考えてみましょう。

String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(1, map.size());

結果のmapには、最初の値をオーバーライドする2番目の put()操作のため、1つの要素( “secondValue”)、しかありません。 Guavaと同じ動作を実現したい場合マルチマップ を作成する必要があります地図それはリスト値型として:

String key = "a-key";
Map<String, List<String>> map = new LinkedHashMap<>();

List<String> values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }

map.put(key, values);

assertEquals(1, map.size());

明らかに、使用するのはあまり便利ではありません。 また、コードにそのようなニーズがある場合は、GuavaのMultimapjava.util.Map。よりも優れた選択肢になる可能性があります。

ここで注意すべきことの1つは、2つの要素を含むリストがありますが、 size()メソッドは1を返すことです。 Multimapでは、size() Map、に格納されている実際の値の数を返しますが、 keySet()。size()は個別のキーの数を返します。

5. マルチマップの長所

マルチマップは、一般的に、 地図 >> そうでなければ現れたでしょう。 違いは次のとおりです。

  • put()を使用してエントリを追加する前に、空のコレクションにデータを入力する必要はありません。
  • get()メソッド二度と戻らないヌル 、空のコレクションのみ(チェックする必要はありません) ヌルのように地図 >> テストケース)
  • キーは、少なくとも1つの値にマップされる場合にのみ、Multimapに含まれます。 キーに関連付けられた値がゼロになる操作は、そのキーをから削除する効果があります。 マルチマップ (の地図 >、 コレクションからすべての値を削除しても、空のままですコレクション値として、これは不要なメモリオーバーヘッドです)
  • エントリ値の合計数は、 size()として利用できます。

6. 結論

この記事では、GuavaMultimapをいつどのように使用するかを示します。標準のjava.util.Mapと比較し、GuavaMultimap。の長所を示します。

これらの例とコードスニペットはすべて、 GitHubプロジェクトにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。