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)
如果要修改现有映射而不是生成新映射(如示例所示),则根本不需要使用该流.用途Map.replaceAll
:
items.replaceAll((k, v) -> renderTags(v));
return items;
Run Code Online (Sandbox Code Playgroud)
如果您想保持原始地图不变,请参阅其他答案.
您可以通过以下方式尝试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 简单且根本不昂贵。