HashMapを直接(リテラルに)初期化する方法は?
JavaのHashMapをこのように初期化する方法はあるのでしょうか。
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
正しい構文とはどのようなものでしょうか?これに関するものは見つかりませんでした。このようなことは可能でしょうか?私は、マップの作成時にあらかじめ知っている、決して変化しないいくつかの "final/static" 値をマップに入れるための最短/最速の方法を探しています。
986
6
Java Version 9以上の場合。
はい、これはもう可能です。Java 9では、マップの作成を簡単にするファクトリーメソッドがいくつか追加されました。
上記の例では、
test
とtest2
の両方が同じになり、Mapの表現方法が異なるだけである。Map.ofメソッドはマップの要素を10個までと定義されているが、
Map.ofEntries`メソッドにはそのような制限はないだろう。この場合、結果のマップはイミュータブルマップになることに注意してください。もしマップをミュータブルにしたい場合は、例えば
mutableMap = new HashMap(Map.of("a", "b"));
を用いて再度コピーします。(JEP 269](http://openjdk.java.net/jeps/269) と Javadoc も参照)。
Java Version 8 までの場合。
いいえ、すべての要素を手動で追加する必要があります。匿名サブクラスでイニシャライザーを使用すると、構文を少し短くすることができます。
しかし、匿名サブクラスは、場合によっては不要な動作を引き起こす可能性があります。これには例えば
初期化に関数を使うと、イニシャライザでマップを生成することも可能になりますが、厄介な副作用を避けることができます。
これは一つの方法です。
しかし、注意しなければならないのは、上記のコード(HashMapを継承した新しいクラスを作成している)をしっかりと理解することです。したがって、ここで詳細を読んでおく必要があります。 http://www.c2.com/cgi/wiki?DoubleBraceInitialization または、単にGuavaを使用する。
サードパーティのライブラリを許可する場合は、GuavaのImmutableMapを使用して、文字通りのような簡潔さを実現できます。
これは最大5キー/値ペアで機能します。それ以外の場合は、ビルダー:を使用できます。
-GuavaのImmutableMap実装はJavaのHashMap実装とは異なることに注意してください(特に、不変であり、nullキー/値を許可していません)。 -詳細については、不変のコレクションタイプに関するGuavaのユーザーガイドの記事を参照してください。
これを行う直接的な方法はありません-JavaにはMapリテラルはありません(まだ-Java 8に提案されたと思います)。
このような人もいます。
これにより、HashMapの匿名サブクラスが作成され、インスタンスイニシャライザーがこれらの値を配置します。 (ちなみに、マップには同じ値を2倍に含めることはできません。2番目のputが最初の値を上書きします。 次の例では、さまざまな値を使用します。)。
通常の方法はこれです(ローカル変数の場合)。
test
マップがインスタンス変数である場合は、初期化をコンストラクターまたはインスタンス初期化に配置します。test
マップがクラス変数の場合は、初期化を静的初期化に配置します。マップを変更しない場合は、初期化後にマップを
Collections.unmodifiableMap(。..)
。 これは静的イニシャライザでも実行できます。(これで「テスト」を最終的にできるかどうかはわかりません。 ... 試して、ここで報告してください。)。
プレーンJava 7クラスとvarargsを使用する代替案:この方法でクラス「HashMapBuilder」を作成します。 。
次のような方法を使用します。