private void processAddCommand(final K key) {
            if (isDestroyed.get()) {
                return;
            }
            final boolean stillValid = requestedToAdd.containsKey(key);
            //if stillValid = false, then the process command was outdated by later changes to requestedToRemove -> in this case ignore it
            if (stillValid) {
                final V newValue = requestedToAdd.remove(key);
                final boolean alreadyExists = objectMap.containsKey(key);
                final C ctx;
                if (alreadyExists) {
                    final Pair<V, C> oldVc = objectMap.get(key);
                    ctx = changeExecutor.replace(key, oldVc == null ? null : oldVc.first, oldVc == null ? null : oldVc.second, newValue);
                } else {
                    ctx = changeExecutor.add(key, newValue);
                }
                objectMap.put(key, new Pair<>(newValue, ctx));
            }
        }
replaces objects in this Map completely with given objects
<br>
Same effect could be reached by calling removeAll() followed by add(newObjects),
but performance is better when calling replace() method instead
main/src/main/java/cgeo/geocaching/utils/AsynchronousMapWrapper.java