40

単純なデフォルトで新しいものを作成したい場合はMultimap、現在、次のようなことを行う必要があります。

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

Maps.newHashMap...バッキングマップにが使用されている場合、Javaは正しいタイプを推測できないためです。もちろん、これは別のメソッドにリファクタリングすることもできますが、もっと簡潔に書く方法はすでにありますか?

4

6 に答える 6

58

ArrayListMultimap.create()こんなに単純なケースに使ってみませんか?これは、おそらく最も一般的に使用されるマルチマップである単純なHashMap/ArrayListを作成するためのデフォルトの方法です。

于 2012-05-17T14:25:36.087 に答える
20

クライアントを作成し、クエリパラメータのマップを作成するときに、この問題が発生します。マルチマップを作成するために私が好きな簡潔なパターンは、ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
  ImmutableMultimap.<String, String>builder()
    .put("key-1", "value-1")
    .put("key-1", "value-2")
    .build();
于 2016-08-05T19:14:24.660 に答える
15

Guavaのドキュメントには、create他のいくつかの回答で提唱されている方法は、以下に示すさまざまな形式を優先して「間もなく廃止される」と記載されているため、避ける必要があります。

Guava 21.0以降では、値がコレクションMultimapに格納されるオブジェクトを作成するための推奨される方法は次のとおりです。ArrayList

MultimapBuilder.hashKeys().arrayListValues().build();

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

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();

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

MultimapBuilder.hashKeys().arrayListValues().build(multimap);

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

于 2017-05-14T12:15:30.213 に答える
6

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

Multimap<Integer, String> multi = HashMultimap.create();
于 2016-10-28T05:44:23.237 に答える
4

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

次のようになります。

Multimap<Key, Value> providersToClasses =
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
于 2016-09-16T08:22:50.487 に答える
2

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

于 2012-05-21T09:13:02.687 に答える