code: @Beta
      public static <K, V> Map<K, V> mergeMaps(Map<K, V> first, Map<K, V> second, V defaultValue) {
          checkArgument(first != null, "Expected non-null first map");
          checkArgument(second != null, "Expected non-null second map");
          checkArgument(defaultValue != null, "Expected non-null default value");
  
          Map<K, V> map = new HashMap<K, V>();
          //noinspection ConstantConditions
          for (Map.Entry<K, V> entry : first.entrySet()) {
              if (entry.getKey() == null) {
                  continue;
              }
              map.put(entry.getKey(), entry.getValue() == null ? defaultValue : entry.getValue());
          }
          //noinspection ConstantConditions
          for (Map.Entry<K, V> entry : second.entrySet()) {
              if (entry.getKey() == null) {
                  continue;
              }
              map.put(entry.getKey(), entry.getValue() == null ? defaultValue : entry.getValue());
          }
          return map;
      }
docs: Mergers two maps handling null keys, null values and duplicates
  
  @param first        the first map to merge
  @param second       the second map to merge
  @param defaultValue the value to be used in case of null value
  @param <K> the key type
  @param <V> the value type
  @return a single map containing entries from the given maps
  @throws IllegalArgumentException if any of the arguments is null