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