code: public static <K, V, M extends Map<K, V>> M merge(Stream<? extends Map<K, V>> stream,
  	                                                  BinaryOperator<V> mergeFunction,
  	                                                  Supplier<M> mapSupplier) {
  
  		Assert.notNull(stream, "Missing map merge function!");
  		Assert.notNull(mergeFunction, "Missing map merge function!");
  		Assert.notNull(mapSupplier, "Missing map supplier!");
  
  		return stream.collect(mapSupplier,
  		                      (a, b) -> b.forEach((k, v) -> a.merge(k, v, mergeFunction)),
  		                      Map::putAll);
  	}
docs: Merging single level aggregation maps
  
  @param stream        source to merge
  @param mergeFunction operation
  @param mapSupplier   new map supplier
  @param <K>           type of key
  @param <V>           type of value
  @param <M>           type of map supplier
  @return new merged map