配列のマップのキー自動チェック登録

リストのケースに触発されて、配列の場合、、、

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