グアバマルチマップガイド

グアバマルチマップガイド

1. 概要

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

2. メーベン依存

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


    com.google.guava
    guava
    21.0

最新バージョンはhereで見つけることができます。

3. Multimapの実装

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

String key = "a-key";
Multimap 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>が取得されます。

Collection values = map.get(key);

印刷値が出力されます:

[firstValue, secondValue]

4. 標準のMapと比較して

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

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

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

assertEquals(1, map.size());

結果のmapには1つの要素しかありません(最初の値をオーバーライドする2番目のput()操作のため、“secondValue”),。 GuavaのMultimap,と同じ動作を実現したい場合は、値型としてList<String>を持つMapを作成する必要があります。

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

List 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のMultimapの方がjava.util.Map.よりも優れている可能性があります。

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

5. Multimapの長所

マルチマップは通常、Map<K, Collection<V>>が表示される場所で使用されます。 違いは次のとおりです。

  • エントリにput()を追加する前に、空のコレクションにデータを入力する必要はありません。

  • The get() methodnullを返すことはなく、空のコレクションのみを返します(Map<String, Collection<V>>テストケースのようにnullをチェックする必要はありません)

  • キーが少なくとも1つの値にマップされている場合に限り、キーはMultimapに含まれます。 キーに関連付けられた値がゼロになる操作は、そのキーをMultimapから削除する効果があります(コレクションからすべての値を削除しても、Map<String, Collection<V>>,では空のCollectionを値として、これは不要なメモリオーバーヘッドです)

  • エントリ値の合計数は、size()として利用できます。

6. 結論

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

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