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

时间:2017-11-05 15:54:15

标签: java concurrency concurrenthashmap

我有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;
}

这真的是对的吗?是否可以在一次迭代中完成?

1 个答案:

答案 0 :(得分:3)

您可以使用方法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));
}