バックエンド

【Java】MapのvalueにListを使う!初期化もしてくれるメソッド作ってみた!

map-value-list-method
野田竣介

今回はこのような質問をいただきました。

MapのvalueにList入れるのめんどくさいな…

MapのvalueにListを入れる場合、ちょっと面倒ですよね。

そこで今回はこちらの質問について解説していきます!

環境
  • Java 11
  • Play Framework 2.6
  • IntelliJ IDEA ULTIMATE 2019.2

GuavaのMultimapで解決!

結論から言うと、GuavaのMultimapというもの利用することで簡単に実装できます。

ただ、ライブラリを入れるほどでもないということもあると思うので、独自に作ってみました!

MapのvalueにListを入れる場合、ちょっと面倒ですよね。

  1. Mapを用意する
  2. 値のListに1つ追加する
    • 初回はListを初期化する
    • 2回目以降はそのまま追加する

みたいなことをする必要があります。

毎回、分岐処理を書くのも面倒なので共通化しましょう!

値を渡せばいい感じに追加してくれるメソッド!

/**
 * map の key の List に value を追加して map を返す
 * @param map 追加対象のMap
 * @param key 追加するキー
 * @param value 追加する値
 * @param <K> キーの型
 * @param <V> 値の型
 * @return 値を追加したMap
 */
public static <K, V> HashMap<K, List<V>> add(HashMap<K, List<V>> map, K key, V value) {
    List<V> list = map.get(key);
    if (Objects.isNull(list)) {
        list = new ArrayList<>();
    }
    list.add(value);
    map.put(key, list);
    return map;
}
使い方
  • map:値を追加するMapを指定してください。このMapの値(List)にvalueを追加したものが戻り値となります。
  • key:追加したいkeyを指定してください。
  • value:Listに追加したいvalueを指定してください。

使ってみた!

HashMap<String, List<String>> map = new HashMap<>();
map = add(map, "a", "12345");
map = add(map, "a", "123");
map = add(map, "b", "246");
map.forEach((key, value) -> System.out.println(key + " は " + value + " です"));
a は [12345, 123] です
b は [246] です

初回の追加でも何も考えずに追加できるのでいいですね!

あとがき

Enumのように、決まっている値がキーであれば最初にすべて初期化すると楽ですね。

今回のような処理も不要だと思います。

メソッドの引数の参照渡しができたらもっと使いやすくなるけど、Javaだとできないっぽい。

戻り値を設定するしか方法はないのかなぁ。

記事URLをコピーしました