当前位置: 首页 > 知识库问答 >
问题:

在java 8 foreach中使用字符串替换

司寇嘉茂
2023-03-14

我已经看过这个问题,但我的问题有点不同。

我有一个“baseString”,n HashMap和一个输出字符串。我想用hashmap填充baseString,来构造一个json调用参数。

我已经用Java 7完成了,方法是这样的:

HashMap<String,Integer> element= getAllElement();

String baseElem="{\"index\":{}}\r\n" + 
        "{\"name\":\"$name$\",\"age\":$age$}";

String result=baseElem;

for (Map.Entry<String, Integer> entry : element.entrySet()) {

    result=result.replace("$name$", entry.getKey());
    result=result.replace("$age$", entry.getValue().toString());
    result=result+baseElem;
}
result= result.replace(baseElem, "");

现在我想用Java 8实现同样的效果,我已经尝试了以下方法:

element.forEach((k,v)->{
            result=result.replaceAll("$name$", k);
            result=result.replaceAll("$age$", v.toString());
            result=result+baseElem;
        });

但是对于每个结果,我都有一个错误

“封闭范围中定义的局部变量结果必须是final或有效final”

所以问题是:我能用Java 8和streams以某种方式做到这一点吗?或者没有办法,所以我可以使用简单的Java 7 for

共有3个答案

储志业
2023-03-14

它认为,你可以使用这个:

private static Map<String, Integer> getAllElement() {
    Map<String, Integer> map = new HashMap<>();
    map.put("\\$name\\$", 666);
    map.put("\\$age\\$", 777);
    return map;
}

Map<String, Integer> map = getAllElement();
String[] json = { "{\"index\":{}}\r\n{\"name\":\"$name$\",\"age\":$age$}" };

map.forEach((key, val) -> json[0] = json[0].replaceAll(key, String.valueOf(val)));
System.out.println(json[0]);

输出:

{"index":{}}
{"name":"666","age":777}
潘皓
2023-03-14

至于“在封闭作用域中定义的局部变量结果必须是final或effectively final”的进一步解释见这个答案。

至于:

所以问题是:我能用Java 8和streams以某种方式做到这一点吗?或者是没有办法,让我可以用简单的Java 7来进行?

您使用迭代方法执行的逻辑在函数世界(即流)中称为“折叠”或“减少”。

所以,你要做的是:

String result = element.entrySet()
                .stream()
                .reduce(baseElem,
                        (e, a) -> e.replace("$name$", a.getKey()).replace("$age$",
                                a.getValue().toString()),
                        (x, y) -> {
                            throw new RuntimeException();
                        });

减少的第三个输入参数称为合路器函数,它应该是一个关联,非干扰,无状态的函数,用于组合两个值,该值必须与累加器函数兼容。

如果您不打算使用并行流,那么当前逻辑应该足够了,否则您需要替换<code>(x,y)-

单于钊
2023-03-14

你的方法完全走错了方向。这不仅与流API采用的函数式编程风格相矛盾。甚至循环也非常低效,对不断增长的结果字符串执行重复的字符串连接和替换操作。

你做了一个画家的算法

实际上,您只想对每个映射条目的baseElem模板执行替换,并连接所有结果。这可以直接表示为:

Map<String,Integer> element = getAllElement();

String baseElem = "{\"index\":{}}\r\n{\"name\":\"$name$\",\"age\":$age$}";

String result = element.entrySet().stream()
    .map(e -> baseElem.replace("$name$", e.getKey())
                      .replace("$age$",  e.getValue().toString()))
    .collect(Collectors.joining());
 类似资料:
  • 尝试基于列值替换字符串,获取错误值error:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 获取错误值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 我只需要检查字符串,如果匹配,则用另一个列值替换它

  • 我们希望替换整个xml文件中的一些特殊字符,并使用XSLT1.0对xml应用一些模板。 它将产生预期的输出。但这是示例xml文件,但实际上我们有许多节点的xml文件,其中可能包含需要用“*”替换的字符。在选择值时应用转换函数是一个巨大的过程。 有谁能指导我如何替换xml文件中的字符,然后应用模板来使用XSLT1.0获得预期的响应吗?。

  • 我有一个熊猫数据框(通过导入csv文件创建)。我想用NaN替换空白值。这些空白值中有些是空的,有些包含(可变数量的)空格,,,等等。 使用这个线程中的建议 它会替换所有只包含空格的字符串,但也会替换每个包含空格的字符串,这不是我想要的。 如何仅用空格和空字符串替换字符串?

  • 本文向大家介绍替换Java字符串中的子字符串,包括了替换Java字符串中的子字符串的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的字符串。 我们想将子字符串“ Dead”替换为“ Alive”。为此,让我们使用以下逻辑。在这里,我们使用了while循环,并在其中找到了要替换的子字符串的索引。这样,我们一个接一个地替换了整个子字符串。 以下是替换子字符串的完整示例。 示例 输出结果

  • 因此,我正在处理一个项目,其中我必须将包含希腊字母的字符串转换为包含此字母的英语表示的字符串。因此,希腊将变为,将成为。 我已经创建了一个HashMap,它具有从Unicode字符到普通字符串的适当转换。 我使用了一个简单的循环来检查输入中的是否是中的,如果是,那么我将使用附加其替换。以下是我用来执行此操作的代码: 这是一个公共静态方法,以< code>String作为输入。我想知道的是,是否有可

  • 我有一个PHP脚本这是一个字符串替换函数,它接受数组中的字符,如果在字符串中找到任何字符,就替换它们。是否有与该函数等价的java函数。我找到了一些方法,但有些是使用循环,有些是重复语句,但在Java中没有找到类似的单行解决方案。