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