我知道有很多问题和答案与类似问题相关,但我无法找到问题的答案。这是我的代码的一小部分:
private String substitute(String text) {
List<Macro> macros = getMacros();
for (Macro macro : macros) {
text = StringUtils.replace(text, macro.getKey(), macro.getValue());
}
return text;
}
StrSubstitutor
类,但由于令牌/宏的格式(不同的格式而不是固定的前缀/后缀),我不能这样做。由于性能问题,我也不想使用正则表达式。 根据工作中的一些编码规则,我需要将参数标记为final
。我想知道这在这里确实是不错的做法。我知道字符串是不可变的,我知道每当我调用StringUtils.replace()
时,它都会返回一个新的String对象。但我想知道这里的String参数是否应该按建议标记为final,并且在方法中执行如下操作:
String result = text;
for (Macro macro : macros) {
result = StringUtils.replace(result, macro.getKey(), macro.getValue());
}
我不喜欢这样。
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
您可以使用 apache velocity 将带有键的字符串替换为带有值的等效字符串。
答案 1 :(得分:0)
如果您对性能有一些担忧,可以使用StringBuilder,它允许您将文本参数声明为final:
private String substitute(final String text) {
List<Macro> macros = getMacros();
StringBuilder stringBuilder=new StringBuilder(text);
for(Macro macro: macros) {
int index=stringBuilder.indexOf(macro.getKey());
if (index!=-1) {
stringBuilder.replace(index, index+macro.getKey().length(), macro.getValue());
}
}
return stringBuilder.toString();
}
答案 2 :(得分:0)
您的担忧似乎有效。字符串是不可变的,因此它会创建多个对象。您应该使用StringBuilder还是StringBuffer。
我为你写了一个样本。从这里构建
private static String substitute(String text) {
List<Macro> macros = getMacros();
StringBuffer st = new StringBuffer(text);
for (Macro macro : macros) {
int start = st.indexOf(macro.getKey());
if (start != -1) {
st.replace(start, start + macro.getKey().length(), macro.getValue());
}
}
return st.toString();
}
干杯!!