Mapの初期化を1行で書く

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)