ConcurrentHashMap 与并行流删除键

ConcurrentHashMap with parallel Streams to remove keys

我有以下顺序代码,使用另一个键列表从散列映射中删除条目。映射大小可以是 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 步骤从一个键映射到另一个键,如果不能删除,则映射到 nullnull然后过滤。

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

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

或者通过键集的 remove 方法 returns a boolean 因此可以直接用作 Predicate

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