private void processRemoveCommand(final K key) {
            if (isDestroyed.get()) {
                return;
            }
            final boolean stillValid = requestedToRemove.remove(key);
            //if stillValid = false, then the process command was outdated by later changes to requestedToRemove -> in this case ignore it
            if (stillValid) {
                if (objectMap.containsKey(key)) {
                    final Pair<V, C> vc = objectMap.remove(key);
                    Objects.requireNonNull(vc);
                    changeExecutor.remove(key, vc.first, vc.second);
                } else {
                    // at this point, object MUST be in map -> programming bug
                    Log.e(LOG_PREFIX + "requesting non-existing object for removal -> must be programming bug!");
                }
            }
        }
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