単純なデフォルトで新しいマルチマップを作成したい場合、次のようなことを今すぐに行う必要があります。
private final Multimap<Key, Value> providersToClasses = Multimaps
.newListMultimap(
new HashMap<Key, Collection<Value>>(),
new Supplier<List<Value>>() {
@Override
public List<Value> get() {
return Lists.newArrayList();
}
});
Javaは、Maps.newHashMap
は、バッキングマップに使用されます。もちろん、これは別のメソッドにリファクタリングできますが、すでにもっと簡潔に書く方法はありますか?
このような単純な場合に ArrayListMultimap.create()
を使用しないのはなぜですか?これは、おそらく最も一般的に使用されるマルチマップである、単純なHashMap/ArrayListを作成するデフォルトの方法です。
クライアントを作成し、クエリパラメータのマップを作成するときに、この問題に遭遇します。マルチマップを構築するために気に入っている簡潔なパターンは、 ImmutableMultiMap#builder
Multimap<String, String> queryParams =
ImmutableMultimap.<String, String>builder()
.put("key-1", "value-1")
.put("key-1", "value-2")
.build();
Guava documentation は、他の回答によって提唱されているcreate
メソッドが「廃止予定です」以下に示すさまざまな形式を好むため、避ける必要があります。
Guava 21.0以降、値がMultimap
コレクションに保存されているArrayList
オブジェクトを作成する推奨方法は以下:
_MultimapBuilder.hashKeys().arrayListValues().build();
_
マップ内のキーの予想数とキーごとの値の予想数を指定する場合も、パラメーターを使用できます。
_MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
_
最後に、次の構成を使用して、既存のものから新しいMultimap
を作成できます。
_MultimapBuilder.hashKeys().arrayListValues().build(multimap);
_
ArrayLists
でMultimap
以外のデータ構造を使用したい場合は、arrayListValues()
の呼び出しを ここにリストされている他のいくつかのものに置き換えることができます。 。
コンパクトなソリューションは次のとおりです。
Multimap<Integer, String> multi = HashMultimap.create();
Java 8では、これは、あらゆる種類のマルチマップに対して、はるかに優れています。これは、2つの理由によります。
HashMap
コンストラクターに明示的な型引数を指定する必要はありません。ArrayList
ファクトリを作成できます。次のようになります。
Multimap<Key, Value> providersToClasses =
Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
ただし、元の型推論の問題に答えるために、Maps.<Key, Collection<Value>>newHashMap()
を使用して静的メソッドでジェネリック型を指定することもできますが、new HashMap<Key, Collection<Value>>()
よりも簡潔ではありません(より一貫性がある場合があります) )。