java:${}的模板字符串替换
1 前言
模板字符串中经常使用${变量名}来进行字符串的变量替换,可使用commons-text库中的工具方式实现该功能。
依赖配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
2 使用
package com.xiaoxu.tool.demo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.text.StringSubstitutor;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author xiaoxu
* @date 2022-08-08
* spring_boot:com.xiaoxu.tool.demo.TestReplace
*/
@Slf4j
public class TestReplace {
private static final String prefix = "${";
private static final String suffix = "}";
/*
* commons-text
* */
public static String replaceVar(Map<String,String> vars,String template){
if(!StringUtils.hasLength(template)){
log.info(String.format("调用%s方法失败,模板字符串替换失败,模板字符串不能为空",
Thread.currentThread().getStackTrace()[1].getMethodName()));
return null;
}
if(MapUtils.isEmpty(vars)){
log.info(String.format("调用%s方法失败,模板字符串替换失败,map不能为空",
Thread.currentThread().getStackTrace()[1].getMethodName()));
return null;
}
List<String> tempStrs = vars.keySet().stream().map(s -> prefix + s + suffix).
collect(Collectors.toList());
tempStrs.forEach(t->{
if(!template.contains(t)){
throw new RuntimeException(String.format("调用%s方法失败,模板字符串替换失败,map的key必须存在于模板字符串中",
Thread.currentThread().getStackTrace()[1].getMethodName()));
}
});
StringSubstitutor stringSubstitutor = new StringSubstitutor(vars);
return stringSubstitutor.replace(template);
}
public static void main(String[] args) {
/*
* 错误的场景:比如${变量},{}内不能含有空格等等
* System.out.println(replaceVar(vals, "我叫${ name},今年${age }岁."));
* System.out.println(replaceVar(new HashMap<>(), temp));
* System.out.println(replaceVar(vals, "我叫xiaoxu"));
* System.out.println(replaceVar(vals, "我叫${name},今年${age1}岁."));
* */
Map<String,String> vals = new HashMap<>();
vals.put("name","xiaoxu");
vals.put("age","36");
String temp = "我叫${name},今年${age}岁.";
System.out.println(replaceVar(vals, temp));
}
}
执行结果:
我叫xiaoxu,今年36岁.