我有以下代码String
和HashMap
:
Map<String, String> map = new HashMap<>();
map.put("ABC", "123");
String test = "helloABC";
map.forEach((key, value) -> {
test = test.replaceAll(key, value);
});
我尝试用HashMap
值替换字符串,但这不起作用,因为test
是最终的,无法在forEach
的正文中重新分配。
那么有没有使用Java 8 Stream API将String
替换为HashMap
的解决方案?
答案 0 :(得分:3)
由于仅使用forEach()
无法进行此操作(message
必须有效最终),解决方法可能是创建一个存储单个{{1}的最终容器(例如List
)重写:
String
请注意,我将final List<String> msg = Arrays.asList("helloABC");
map.forEach((key, value) -> msg.set(0, msg.get(0).replace(key, value)));
String test = msg.get(0);
更改为replace()
,因为前者与正则表达式一起使用,但是根据您的代码进行判断似乎需要用字符串本身替换(不要担心,尽管名称混乱,它也会替换< em>所有次出现。)
如果您想要完整的Stream API,可以使用reduce()
操作:
replaceAll()
但请注意,这种减少只能在串行(非并行)流中正常工作,其中从不调用组合器函数(因此可能是任何)。
答案 1 :(得分:3)
这类问题不适合Streams API。 Streams的当前版本主要针对可以并行的任务。也许将来会增加对此类操作的支持(参见https://bugs.openjdk.java.net/browse/JDK-8133680)。
您可能会感兴趣的一种基于流的方法是减少函数而不是字符串:
Function<String, String> combined = map.entrySet().stream()
.reduce(
Function.identity(),
(f, e) -> s -> f.apply(s).replaceAll(e.getKey(), e.getValue()),
Function::andThen
);
String result = combined.apply(test);