private void replace(final Collection<? extends K> newKeys, final Func1<K, V> valueGetter) {
        requestChange(() -> {
            //calculate what to add/remove to currently drawn set to reach toReplace state finally
            final Map<K, V> toAdd = new HashMap<>();
            for (K key : newKeys) {
                toAdd.put(key, valueGetter.call(key));
            }
            final Iterator<Map.Entry<K, V>> it = toAdd.entrySet().iterator();
            while (it.hasNext()) {
                final Map.Entry<K, V> entry = it.next();
                if (!isChange(entry.getKey(), entry.getValue())) {
                    it.remove();
                }
            }

            final Set<K> toRemove = new HashSet<>(objectMap.keySet());
            toRemove.removeAll(newKeys);
            //clear all existing requests to add/remove
            requestedToAdd.clear();
            requestedToRemove.clear();
            mapChangeProcessQueue.clear();
            //refill pipeline with requests to add/remove
            requestedToAdd.putAll(toAdd);
            requestedToRemove.addAll(toRemove);
            for (K o : toRemove) {
                mapChangeProcessQueue.add(new Pair<>(o, false));
            }
            for (K o : toAdd.keySet()) {
                mapChangeProcessQueue.add(new Pair<>(o, true));
            }
        });
    }
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