用JRE库替换StrSubstitutor

目前,我正在org.apache.commons.lang.text.StrSubstitutor这样做:

Map m = ...

substitutor = new StrSubstitutor(m);

result = substitutor.replace(input);

考虑到我想commons-lang从项目中删除依赖的事实,StrSubstitutor使用标准JRE库将是一种可行且简单的实现方式吗?

StrSubstitutor 像这样工作:

Map map = new HashMap();

map.put("animal", "quick brown fox");

map.put("target", "lazy dog");

StrSubstitutor sub = new StrSubstitutor(map);

String resolvedString = sub.replace("The ${animal} jumped over the ${target}.");

产生resolveString =“快速的棕狐跳过了懒狗。

回答:

如果性能不是优先事项,则

可以使用类的appendReplacement方法Matcher

public class StrSubstitutor {

private Map<String, String> map;

private static final Pattern p = Pattern.compile("\\$\\{(.+?)\\}");

public StrSubstitutor(Map<String, String> map) {

this.map = map;

}

public String replace(String str) {

Matcher m = p.matcher(str);

StringBuilder sb = new StringBuilder();

while (m.find()) {

String var = m.group(1);

String replacement = map.get(var);

m.appendReplacement(sb, replacement);

}

m.appendTail(sb);

return sb.toString();

}

}

一个更高性能但更丑陋的版本,只是为了好玩:)

    public String replace(String str) {

StringBuilder sb = new StringBuilder();

char[] strArray = str.toCharArray();

int i = 0;

while (i < strArray.length - 1) {

if (strArray[i] == '$' && strArray[i + 1] == '{') {

i = i + 2;

int begin = i;

while (strArray[i] != '}') ++i;

sb.append(map.get(str.substring(begin, i++)));

} else {

sb.append(strArray[i]);

++i;

}

}

if (i < strArray.length) sb.append(strArray[i]);

return sb.toString();

}

根据我的测试,它大约是regex版本的2倍,比apache

commons版本的3倍快。因此,普通的regex东西实际上比apache版本更优化。通常通常不值得。只是为了好玩,让我知道您是否可以使其更优化。

:正如@kmek指出的,有一个警告。Apache版本将过渡解决。例如,如果${animal}映射到${dog}dog映射到Golden

Retriever,则apache版本将映射${animal}到Golden

Retriever。如我所说,您应该尽可能使用库。仅当您有不允许您使用库的特殊约束时,才可以使用上述解决方案。

以上是 用JRE库替换StrSubstitutor 的全部内容, 来源链接: utcz.com/qa/402852.html

回到顶部