ふりぶろぐ
Web Engineer's Blog
Java

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

Java
りーふ

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

と毎回思っていたので簡単にできるようにしてみました!

※2020/01/17 追記
GuavaのMultimapというものを発見しました!
これでもっと簡単に同じようなことができます。

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

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だとできないっぽい。
戻り値を設定するしか方法はないのかなぁ。

ABOUT ME
りーふ
たまにブログを書いてるWebエンジニア。 サーバーサイドメインでインフラとフロントエンドもたまにやります。 Javaが得意。 Play Frameworkが好き。 本業は迷惑をかけない程度に手を抜くスタイル。 意識高い系は苦手。