Setコレクションのマップキーチェック add

リストMap の リストに要素を追加(3) - Oboe吹きプログラマの黙示録

リストMap の リストに要素を追加(4) - Oboe吹きプログラマの黙示録

を書いたので、Set の方も、、、

Set の場合は、TreeSet や、HashSet を指定できた方が良いので、未指定→HashSet として
この関数インターフェース生成のメソッドは2つ用意しました。

import java.io.Serializable;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
/**
 * Map<K, Set<V>> key存在自動チェック Set add
 */
@FunctionalInterface
public interface MapSetpush<K, V> extends Serializable{

   void accept(K k, V v);

   public static <K, V> MapSetpush<K, V> of(Map<K, Set<V>> m){
      return (k, v)->{
         m.put(k, Optional.ofNullable(m.get(k))
                  .map(e->setAddReturn(v).apply(e))
                  .orElseGet(()->new HashSet<V>(Arrays.asList(v))));
      };
   }

   public static <K, V> MapSetpush<K, V> of(Map<K, Set<V>> m, Supplier<Set> newsupplier){
      return (k, v)->{
         m.put(k, Optional.ofNullable(m.get(k))
                  .map(e->setAddReturn(v).apply(e))
                  .orElse(new Function<V, Set<V>>(){
                     @Override
                     public Set<V> apply(V u){
                        Set<V> s = newsupplier.get();
                        s.add(u);
                        return s;
                     }
                  }.apply(v))
         );
      };
   }

   static <T> UnaryOperator<Set<T>> setAddReturn(T t){
      return s->{
         s.add(t);
         return s;
      };
   }
}

サンプル

Map<String, Set<String>> map = new HashMap<String, Set<String>>();

MapSetpush<String, String> m = MapSetpush.of(map, TreeSet<String>::new);

m.accept("a", "C");
m.accept("a", "A");
m.accept("a", "B");
m.accept("a", "A");

m.accept("b", "B");
m.accept("b", "C");
m.accept("b", "B");

System.out.println(map);

結果

{a=[A, B, C], b=[B, C]}