Java 8:更改EntrySet流的值

Ruc*_*oom 6 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
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,作为items地图值的字符串标有标签.我想getItems()返回所有项目,但使用该renderTags(String)方法解析字符串.就像是:

// Doesn't work
items.entrySet().stream().map(e -> e.setValue(renderTags(e.getValue())));
Run Code Online (Sandbox Code Playgroud)

这样做最有效的方法是什么?

Did*_*r L 13

如果你想要一个Map结果:

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

  • 哦,你差不多快了整整一分钟:/ (2认同)
  • 你确定你的`Map`导入真的是`java.util.Map`吗? (2认同)

Tag*_*eev 8

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

items.replaceAll((k, v) -> renderTags(v));
return items;
Run Code Online (Sandbox Code Playgroud)

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


Vla*_*sec 5

您可以通过以下方式尝试Collectors.toMap()

Map<Instant, String> getItems() {
    return items.entrySet().stream()
                .collect(Collectors.toMap(
                            Map.Entry::getKey,
                            entry -> renderTags(entry.getValue())
                         ));
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果名称只是简单地表示“get”,则通常不应将其转换到那里。人们期望 getter 简单且根本不昂贵。

  • 是的,战利品归胜利者所有。 (2认同)