code: public <X extends Exception> void replaceAll(Try.BiFunction<? super K, ? super V, ? extends V, X> function) throws X {
          List<K> keyToRemove = null;
          V newVal = null;
  
          for (Map.Entry<K, V> entry : valueMap.entrySet()) {
              newVal = function.apply(entry.getKey(), entry.getValue());
  
              if (N.isNullOrEmpty(newVal)) {
                  if (keyToRemove == null) {
                      keyToRemove = new ArrayList<>();
                  }
  
                  keyToRemove.add(entry.getKey());
              } else {
                  try {
                      entry.setValue(newVal);
                  } catch (IllegalStateException ise) {
                      throw new ConcurrentModificationException(ise);
                  }
              }
          }
  
          if (N.notNullOrEmpty(keyToRemove)) {
              for (K key : keyToRemove) {
                  valueMap.remove(key);
              }
          }
      }
docs: The associated keys will be removed if null or empty values are returned by the specified <code>function</code>.
  
  @param function