jdk提供的字符串格式化工具类String.format、MessageFormat使用的占位符不够直观,除了使用重量级的模板引擎外,寻求一种轻量级的方式
Apache StringSubstitutor
commons-text包下的org.apache.commons.text.StringSubstitutor
类
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
- 替换字符串中的${name}等占位符,并可自定义占位符前缀和后缀
示例
- 在占位符中使用分隔符
:-
指定默认值
- 可使用
StringSubstitutor#setValueDelimiter(java.lang.String)
、StringSubstitutor#setValueDelimiter(char)
等方法指定默认值的分隔符 - 可自定义数据来源,实现StringLookup接口即可。
上述示例使用的数据来源是Map,真实场景中会有多种数据载体,如JOSN,POJO等,可实现org.apache.commons.text.lookup.StringLookup
接口来自定义取值逻辑
Spring框架中的PropertyPlaceholderHelper
spring框架中的占位符工具类org.springframework.util.PropertyPlaceholderHelper
它提供了一种简单的方式来解析和替换字符串中的属性占位符。而且这个类是线程安全的,创建实例,定义好前缀后缀之后,全局使用这一个实例即可
-
构造方法定义占位符前缀和后缀
-
重载的构造方法,定义默认值的分隔符,可以在占位符中指定默认值
-
执行替换的方法,将Properties中的属性值替换到字符串模板中
示例public static void main(String[] args) { var properties = new Properties(); properties.setProperty("name", "内存瞬时使用率"); properties.setProperty("value", "90%"); var strTemplate = "机器@(name)已经达到@(value)"; var placeholderHelper = new PropertyPlaceholderHelper("@(", ")"); var strReplace = placeholderHelper.replacePlaceholders(strTemplate, properties); System.out.println(strReplace); // 输出 机器内存瞬时使用率已经达到90% }
-
使用默认值,占位符中分隔符后面指定了默认值,字符串占位符如果找不到对应的值 ,则使用默认值
示例
-
重载方法,可自定义数据源来源,如从map或pojo对象中获取值
示例public static void main(String[] args) { var strTemplate = "机器@(name)已经达到@(value)"; var placeholderHelper = new PropertyPlaceholderHelper("@(", ")"); var valueMap = Map.of("name", "cpu瞬时使用率", "value", "70%"); var strReplace2 = placeholderHelper.replacePlaceholders(strTemplate, valueMap::get); System.out.println(strReplace2); // 输出 机器cpu瞬时使用率已经达到70% }