ConcurrentHashMap 与并行流删除键



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

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

一种直接翻译是

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());

相关内容

  • 没有找到相关文章

最新更新