从 ConcurrentMap 中获取和删除所有当前条目

Get and remove all current entries from a ConcurrentMap

我有一个 ConcurrentHashMap 积累了一些应该定期发送到某个地方的更改(用于某种复制)。关于更改,只有任何关键事项的最新值。

所以我需要获取并删除一些快照。快照不需要是原子的,当它的每个条目在操作过程中的某个瞬间反映原始地图的状态就足够了。

重要的是,只有结果中存在且最新的条目才可以从原始地图中删除。我想,应该做以下事情:

<K, V> ConcurrentMap<K, V> getAndRemoveAll(ConcurrentMap<K, V> map) {
    ConcurrentHashMap<K, V> result = new ConcurrentHashMap<>(map);    
    result.forEach((resultKey, resultValue) -> 
    map.computeIfPresent(resultKey,
        (k, mapValue) -> mapValue==resultValue ? null : mapValue)); 
    return result;
}

这真的正确吗?单次迭代是否可行?

您可以使用方法 remove(Object key, Object value),如果值是最新的,它只会删除条目 ,并且操作是原子的。

所以这就是我的建议:

<K, V> Map<K, V> getAndRemoveAll(ConcurrentMap<K, V> map) {
  return map.entrySet().stream()
    .filter(e -> map.remove(e.getKey(), e.getValue()))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}