流式传输地图并在 Java 8 中对其进行修改

Streaming the map and modifying it in Java 8

我知道一旦我们从集合中创建了流,我们就不应在使用流时修改集合,但是不确定以下方法是否适用于我修改地图内的条目而不是从中添加或删除任何内容的地方它。另外,这是始终流式传输地图并使用它的正确方法吗?

creepyCategoryStatuses.entrySet().stream().forEach(entry -> {
        String creepyBlockResponse = (String) getBlockResponse(entry.getKey());
        if (creepyBlockResponse.equalsIgnoreCase("block")){
            entry.setValue(true); 
         //OR creepyCategoryStatuses(entry.getKey(), true);
        }
    });

是的,Map 的这种用法似乎是合法的。请注意,在这种情况下,您不需要流。您可以简单地使用

creepyCategoryStatuses.entrySet().forEach(entry -> {...});

根据您的使用情况,您可以在此处使用 replaceAll

creepyCategoryStatuses.replaceAll((k, v) -> ((String) getBlockResponse(k)).equalsIgnoreCase("block") ? true : v);

我一向喜欢函数范式,所以我会将新数据收集到新地图中,但这是个人喜好问题。

这种修改没有问题,因为设置条目的值不是结构修改。但是,值得注意的是,与 Stream API 或 forEach 方法相比,有更多 Java 8 个特征:

creepyCategoryStatuses.replaceAll((key,value)->
    ((String)getBlockResponse(key)).equalsIgnoreCase("block")||value
);

工作更轻松。请注意,如果条件评估为 false||value 将保留旧值,如您的原始代码中那样。