リストのケースに触発されて、配列の場合、、、
import java.io.Serializable; import java.lang.reflect.Array; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.function.UnaryOperator; /** * Map<K, V[]> key存在自動チェック登録. */ @FunctionalInterface public interface Maparrayadd<K, V> extends Serializable{ void accept(K k, V v); public static <K, V> Maparrayadd<K, V> of(Map<K, V[]> m, int length){ return (k, v)->{ m.put(k, Optional.ofNullable(m.get(k)) .map(e->arrayAddReturn(v).apply(e)) .orElse(new Function<V, V[]>(){ @SuppressWarnings("unchecked") @Override public V[] apply(V u){ V[] ary = (V[])Array.newInstance(u.getClass(), length); ary[0] = u; return ary; } }.apply(v))); }; } static <T> UnaryOperator<T[]> arrayAddReturn(T t){ return a->{ for(int i=0;i < a.length;i++){ if (a[i]==null) { a[i] = t; break; } } return a; }; } }
配列の長さを超える add は無視されるようになっている。
よくある配列のインデックス例外を発生させない。
サンプル
Map<String, Integer[]> map = new HashMap<>(); Maparrayadd<String, Integer> m = Maparrayadd.of(map, 3); m.accept("A", 1); m.accept("A", 2); m.accept("A", 3); m.accept("A", 4); m.accept("B", 10); m.accept("B", 20); System.out.println(map); map.entrySet().stream().forEach(e->{ System.out.println("key = "+ e.getKey()); Arrays.stream(e.getValue()).forEach(System.out::println); });
結果
{A=[Ljava.lang.Integer;@4dd8dc3, B=[Ljava.lang.Integer;@6d03e736} key = A 1 2 3 key = B 10 20 null