我有以下设置:
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())));
最有效的方法是什么?
答案 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()));
}
如果您必须在收集呼叫之前对流执行更新,则非常有用。