@Override public void mergeWith(final SmartMap<K, V> anotherMap, final BinaryFunction<V, V> mergeFunct) { SmartMap<K, V> resultMap = createNewInstance(internalMap); clear(); for (Map.Entry<K, V> entry : anotherMap.entrySet()) { if (resultMap.containsKey(entry.getKey())) { V mergedVal = mergeFunct.apply(resultMap.get(entry.getKey()), entry.getValue()); internalMap.put(entry.getKey(), mergedVal); } else { internalMap.put(entry.getKey(), entry.getValue()); } } }