通过lambda java8转换xml字符串

时间:2018-02-16 08:27:52

标签: java xml lambda java-8

我有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)?

2 个答案:

答案 0 :(得分:2)

您可以使用reduceStream字符串上应用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
     );

这样你就不会有太多的开销。