JavaにはPythonやJavaScriptのようにリテラル {"aaa": 123}
のようにでMapを生成する言語仕様はありません。
そのため、以前のJavaでは変数の宣言と同時に初期化するのが煩わしかったです。
現在の一番のオススメは、Map.of
です。
Map.ofで unmodifiable な Mapを生成 (Java9以降)
jshell> import java.util.Map;
jshell> var m1 = Map.of("aaa", 123, "bbb", 456);
m1 ==> {aaa=123, bbb=456}
# 変更可能なMapがほしい時
jshell> var m2 = new HashMap<String, Integer>(Map.of("aaa", 123, "bbb", 456));
m2 ==> {aaa=123, bbb=456}
1要素のみのunmodifiableなMap (Java8も可)
Map.ofはJava8では使えませんが、1要素のみのMapなら同じ機能を持つCollections.singletonMapがJava8でも使えます。
jshell> import java.util.Collections;
jshell> var m3 = Collections.singletonMap("abc", 123);
m3 ==> {abc=123}
StreamとCollectors.toMapを使って強引に (Java8も可)
もしくは強引に、StreamとCollectors.toMapを使えば、なんとか宣言と同時に初期化できます。
jshell> import java.util.Arrays;
jshell> import java.util.stream.Collectors;
jshell> import java.util.Map;
jshell> Map<String, Integer> m4 = Arrays.stream(new Object[][]{
...> {"aaa", 123},
...> {"bbb", 456},
...> {"ccc", 789},
...> }).collect(Collectors.toMap(objs->(String)objs[0], objs->(Integer)objs[1]));
m4 ==> {aaa=123, ccc=789, bbb=456}
上記のように無理やりJava8でやるぐらいならば、Map.of相当の関数を自作したほうがいいと思います。
/** 2要素のmap作成 */
public static <K, V> Map<K, V> myMapOf(K key1, V val1, K key2, V val2) {
HashMap<K, V> m = new HashMap<K, V>();
m.put(key1, val1);
m.put(key2, val2);
return Collections.unmodifiableMap(m);
}