リストMap の リストに要素を追加(3)

リスト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]}