Java 8:更改EntrySet流的值

时间:2015-06-30 07:20:43

标签: java dictionary java-8 java-stream

我有以下设置:

Map<Instant, String> items;
...
String renderTags(String text) {
    // Renders markup tags in a string to human readable form
}
...
<?> getItems() {
    // Here is where I need help
}

我的问题是,作为items地图值的字符串标有标签。我希望getItems()返回所有项目,但是使用renderTags(String)方法解析字符串。类似的东西:

// Doesn't work
items.entrySet().stream().map(e -> e.setValue(renderTags(e.getValue())));

最有效的方法是什么?

4 个答案:

答案 0 :(得分:12)

如果您想要Map作为结果:

Map<Instant, String> getItems() {
    return items.entrySet()
            .stream()
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    e -> renderTags(e.getValue())));
}

答案 1 :(得分:7)

如果要修改现有地图而不是生成新地图(如示例所示),则根本不需要使用该流。使用Map.replaceAll

items.replaceAll((k, v) -> renderTags(v));
return items;

如果您想保持原始地图不变,请参阅其他答案。

答案 2 :(得分:3)

您可以使用Collectors.toMap()

以这种方式尝试
Map<Instant, String> getItems() {
    return items.entrySet().stream()
                .collect(Collectors.toMap(
                            Map.Entry::getKey,
                            entry -> renderTags(entry.getValue())
                         ));
}

顺便说一下,如果这个名字只是简单地说“得到”,你通常不应该在那里进行转换。人们希望吸气剂很简单,而且根本不具备成本。

答案 3 :(得分:0)

另一种选择可能是

Map<Instant, String> getItems() {
return items.entrySet().stream()
           .peek(entry -> entry.setValue(renderTags(entry.getKey())))
           .collect(Collectors.toMap(Map.Entry::getKey,e -> e.getValue()));
}

如果您必须在收集呼叫之前对流执行更新,则非常有用。