グアバマルチマップガイド
1. 概要
この記事では、Google GuavaライブラリのMap実装の1つであるMultimapについて説明します。 これは、java.util.Mapと同様に、キーを値にマップするコレクションですが、各キーは複数の値に関連付けることができます。
2. メーベン依存
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つの値をMapにput()する単純なケースを考えてみましょう。
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() methodはnullを返すことはなく、空のコレクションのみを返します(Map<String, Collection<V>>テストケースのようにnullをチェックする必要はありません)
-
キーが少なくとも1つの値にマップされている場合に限り、キーはMultimapに含まれます。 キーに関連付けられた値がゼロになる操作は、そのキーをMultimapから削除する効果があります(コレクションからすべての値を削除しても、Map<String, Collection<V>>,では空のCollectionを値として、これは不要なメモリオーバーヘッドです)
-
エントリ値の合計数は、size()として利用できます。
6. 結論
この記事では、GuavaMultimap.をいつどのように使用するかを示します。標準のjava.util.Mapと比較し、GuavaMultimap.の長所を示します。
これらの例とコードスニペットはすべてGitHub projectにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。