Guava ImmutableMapの初期化


140

Guavaには、マップを初期化するための便利なショートカットが用意されています。ただし、マップを9つのエントリに初期化すると、次のコンパイラエラー(Eclipse Indigo)が表示されます。

of(K, V, K, V, K, V, K, V, K, V)タイプのメソッドImmutableMapは引数に適用できません (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

メッセージはそれを言うように見える

ImmutableMapの最大サイズは、キーと値の4つのペアです。

明らかに、これは当てはまりませんが、イニシャライザのサイズを増やすために何をすべきかわかりません。

誰かが足りないものを教えてもらえますか?

回答:


256

エラーメッセージには5つのK, Vペア、合計10個の引数しか含まれていないことに注意してください。これは仕様によるものです。ImmutableMapクラスは6つの異なるof()メソッドを提供し、0〜5 つのキーと値のペアを受け入れます。ありませんof(...)ので、varagsパラメータを受け入れるオーバーロードは、KおよびVさまざまなタイプすることができます。

あなたはImmutableMap.Builder

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

迅速な回答ありがとうございます。標準のマップ初期化子に必要なすべての「プット」を入力する必要がなかったので、グアバを試すことにしました。そのアイデアはこれで終わりです。
user903724

7
@ user903724:ここでGuavaを使用する主な理由は、強力な不変性IMOです。
Jon Skeet

2
それ、またはわずかに削減されたメモリ消費-そして、物事が進むにつれてビルダーの構文はかなり流暢です。
Louis Wasserman、

2
まあ、まだ複数のプットがあるかもしれませんが、それらは現在流暢なAPIを使用しているのでmyMap、それぞれを繰り返す必要はありません.put
ケビンウェルカー

21
また、Jonのサンプルコードがどのようになり、public static finalそれでも機能し、ヘルパーメソッドやstatic{}初期化子が必要ないことにも注意してください。
Kevin Bourrillion、2012

62

マップが短い場合、次のことができます。

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

それより長い場合:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
読みやすさの他に、ImmutableMap.of最大5つのキーと値のペアに対して静的ファクトリを使用できます。次に、ビルダーを使用する必要があります。
Xaerxess、2012

0

「put」は廃止れました。使用しないでください。代わりに.ofを使用してください

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
いいえ。ImmutableMap.putは非推奨です。Jon SkeetはImmutableMap.Builder.putを使用しています。これは、5つ以上のタプルでマップを初期化する方法とまったく同じです。
i2B
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.