web-dev-qa-db-ja.com

グアバマルチマップを作成するコンパクトな方法は?

単純なデフォルトで新しいマルチマップを作成したい場合、次のようなことを今すぐに行う必要があります。

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は、バッキングマップに使用されます。もちろん、これは別のメソッドにリファクタリングできますが、すでにもっと簡潔に書く方法はありますか?

32
Alexey Romanov

このような単純な場合に ArrayListMultimap.create() を使用しないのはなぜですか?これは、おそらく最も一般的に使用されるマルチマップである、単純なHashMap/ArrayListを作成するデフォルトの方法です。

54
Daniel Teply

クライアントを作成し、クエリパラメータのマップを作成するときに、この問題に遭遇します。マルチマップを構築するために気に入っている簡潔なパターンは、 ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
  ImmutableMultimap.<String, String>builder()
    .put("key-1", "value-1")
    .put("key-1", "value-2")
    .build();
15
Sam Berry

Guava documentation は、他の回答によって提唱されているcreateメソッドが「廃止予定です」以下に示すさまざまな形式を好むため、避ける必要があります。

Guava 21.0以降、値がMultimapコレクションに保存されているArrayListオブジェクトを作成する推奨方法は以下:

_MultimapBuilder.hashKeys().arrayListValues().build();
_

マップ内のキーの予想数とキーごとの値の予想数を指定する場合も、パラメーターを使用できます。

_MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
_

最後に、次の構成を使用して、既存のものから新しいMultimapを作成できます。

_MultimapBuilder.hashKeys().arrayListValues().build(multimap);
_

ArrayListsMultimap以外のデータ構造を使用したい場合は、arrayListValues()の呼び出しを ここにリストされている他のいくつかのものに置き換えることができます。

9
Pyves

コンパクトなソリューションは次のとおりです。

Multimap<Integer, String> multi = HashMultimap.create();

Java 8では、これは、あらゆる種類のマルチマップに対して、はるかに優れています。これは、2つの理由によります。

次のようになります。

Multimap<Key, Value> providersToClasses =
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
4
Lii

ただし、元の型推論の問題に答えるために、Maps.<Key, Collection<Value>>newHashMap()を使用して静的メソッドでジェネリック型を指定することもできますが、new HashMap<Key, Collection<Value>>()よりも簡潔ではありません(より一貫性がある場合があります) )。

2
Frank Pavageau