我有String
作为XML。我试图通过regexp转换String
:
public String replaceValueByTag(final String source, String tag, String value) {
return replaceFirst(source, "(?<=<" + tag + ">).*?(?=</" + tag + ">)", value);
}
然后使用标记创建地图,新值:
Map<String, String> params = TAGS.stream().collect(toMap(tag -> tag, tag -> substringByTag(request, tag)));
并使用map替换XML中的值:
public String getConfirm(String request) {
String[] answer = {template};
Map<String, String> params = TAGS.stream().collect(toMap(tag -> tag, tag -> substringByTag(request, tag)));
params.entrySet().forEach(entry -> answer[0] = replaceValueByTag(answer[0], entry.getKey(), entry.getValue()));
return answer[0];
}
如何在不保存数组的情况下编写lambda表达式(lambda采用String
,按地图转换并返回String
)?
答案 0 :(得分:2)
您可以使用reduce
在Stream
字符串上应用template
地图条目的所有元素。
我不确定combiner
应该是什么样的(例如如何将两个部分转换的String
组合成一个包含所有转换的String
,但是如果顺序Stream
就足够了,你不需要组合器:
String result =
params.entrySet()
.stream()
.reduce(template,
(t,e) -> replaceValueByTag(t, e.getKey(), e.getValue()),
(s1,s2)->s1); // dummy combiner
答案 1 :(得分:0)
而不是使用中间贴图,你可以直接应用终端操作,我将使用@Eran建议的.reduce()
操作:
String result = TAGS.stream()
.reduce(
template,
(tmpl, tag) -> replaceValueByTag(tmpl, tag, substringByTag(request, tag),
(left, right) -> left) // TODO: combine them
);
这样你就不会有太多的开销。