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

1。概要

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

2.Mavenの依存関係

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

 com.google.guava guava 29.0-jre 

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

3.マルチマップの実装

Guava Multimapの場合、同じキーに2つの値を追加しても、2番目の値が最初の値をオーバーライドすることはありません。代わりに、結果のマップに2つの値があります。テストケースを見てみましょう:

String key = "a-key"; Multimap map = ArrayListMultimap.create(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(2, map.size()); 

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

{a-key=[firstValue, secondValue]}

キー「a-key」で値を取得すると、結果として「firstValue」と「secondValue」を含むコレクションが取得されます。

Collection values = map.get(key);

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

[firstValue, secondValue]

4.標準マップとの比較

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

String key = "a-key"; Map map = new LinkedHashMap(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(1, map.size()); 

最初の値をオーバーライドする2番目のput()操作のため、結果のマップには1つの要素(「secondValue」)しかありません。我々はグアバのと同じ動作を達成したいはずですMultimapはを我々は、作成する必要があります地図持つリスト値の型としては:

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());
    

明らかに、使用するのはあまり便利ではありません。また、コードにそのようなニーズがある場合は、java.util.MapよりもGuavaのマルチマップの方が適している可能性があります

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

5.マルチマップの長所

マルチマップは通常、マップ がある場所で使用されますそうでなければ現れたでしょう。違いは次のとおりです。

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

6.結論

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

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