ConcurrentHashMap使用并行Streams删除键

时间:2015-10-12 22:37:09

标签: java java-8 concurrent-programming

我有以下顺序代码,使用另一个键列表从哈希映射中删除条目。地图大小可以是50-100k条目,删除密钥列表可以是2k - 10k。我正在寻找使用新的java-8流的解决方案......

    List<Long> removed = new ArrayList<Long>();
    for (Long k : removelist) {
        if (null != map.remove(k)) {
            removed.add(k);
        }
    }

1 个答案:

答案 0 :(得分:5)

一种直接翻译

List<Long> removed = removeList.parallelStream()
        .map(key -> map.remove(key) != null ? key : null)
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

如果可以将map步骤从键移动到键,则将其映射到null(如果不是)。然后过滤null个。

通过直接过滤那些可以移除的键来缩短一点:

    List<Long> removed = removeList.parallelStream()
        .filter(key -> map.remove(key) != null)
        .collect(Collectors.toList());

或通过密钥集remove方法返回boolean,因此可以直接用作Predicate

    List<Long> removed = removeList.parallelStream()
            .filter(map.keySet()::remove)
            .collect(Collectors.toList());