リストMap の リストに要素を追加する時、、 - Oboe吹きプログラマの黙示録
リストMap の リストに要素を追加(2) - Oboe吹きプログラマの黙示録
と書きましたが、、以下に落ち着きそうです。
import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.function.UnaryOperator; /** * Map<K, List<V>> key存在自動チェック登録 */ @FunctionalInterface public interface MapListpush<K, V> extends Serializable{ void accept(K k, V v); static <T> UnaryOperator<List<T>> listAddReturn(T t){ return l->{ l.add(t); return l; }; } public static <K, V> MapListpush<K, V> of(Map<K, List<V>> m){ return (k, v)->{ m.put(k, Optional.ofNullable(m.get(k)) .map(e->listAddReturn(v).apply(e)) .orElse( new Function<V, List<V>>(){ @Override public List<V> apply(V u){ List<V> l = new ArrayList<V>(); l.add(u); return l; } }.apply(v) ) ); }; } }
使用例
Map<String, List<String>> map = new HashMap<>(); MapListpush<String, String> m = MapListpush.of(map); m.accept("a", "A"); m.accept("a", "B"); m.accept("b", "C"); m.accept("b", "D"); System.out.println(map);
結果
{a=[A, B], b=[C, D]}