java的字符串模板
介绍
java如何解决字符串占位符的问题JEP 430
字符串在java中是如何构造的
在编程中,字符串是无处不在的。在编码过程中,要不断的构造字符串
直接使用连字符+
对于很短的字符连接是很方便的,但对于多个+
操作,就十分麻烦了
并且很难读
StringBuffer
StringBuilder
可以方便的操作对象中的字符;但是,对于构造器模式,这样编码显得太繁冗
String Formatter
String composeUsingFormatters(String feelsLike, String temperature, String unit) {
return String.format("Today's weather is %s, with a temperature of %s degrees %s",
feelsLike, temperature, unit);
}
对位置十分敏感;对维护/更改不友好
MessageFormat
String composeUsingMessageFormatter(String feelsLike, String temperature, String unit) {
return MessageFormat.format("Today''s weather is {0}, with a temperature of {1} degrees {2}",
feelsLike, temperature, unit);
}
和Formatter
有类似的缺点,并且不符合习惯
字符串模板
可以解决上述问题
目标
- 可以在编译时运行,并且简化字符串值处理过程
- 增强可读性
- 相对于其他语言,减少模板出现的文图/bug
- java库可以自定义模板
模板表达式
模板表达式不仅仅针对字符串,还有其他结构化文本。
三种类型的模板
- 处理器
- 包含带有嵌入表达式的数据的模板
- (.)字符
模板处理器
模板处理器负责计算嵌入式表达式(模板),并在运行时将其与字符串文本组合以生成最终字符串。
STR
模板处理器
样例
String interpolationUsingSTRProcessor(String feelsLike, String temperature, String unit) {
return STR
. "Today's weather is \{ feelsLike }, with a temperature of \{ temperature } degrees \{ unit }" ;
}
String interpolationOfJSONBlock(String feelsLike, String temperature, String unit) {
return STR
. """
{
"feelsLike": "\{ feelsLike }",
"temperature": "\{ temperature }",
"unit": "\{ unit }"
}
""" ;
}
String interpolationWithExpressions() {
return STR
. "Today's weather is \{ getFeelsLike() }, with a temperature of \{ getTemperature() } degrees \{ getUnit() }";
}
FMT
模板处理器
String interpolationOfJSONBlockWithFMT(String feelsLike, float temperature, String unit) {
return FMT
. """
{
"feelsLike": "%1s\{ feelsLike }",
"temperature": "%2.2f\{ temperature }",
"unit": "%1s\{ unit }"
}
""" ;
}
模板表达式的计算
STR
. "Today's weather is \{ feelsLike }, with a temperature of \{ temperature } degrees \{ unit }" ;
// 等价于下面两行
StringTemplate str = RAW
. "Today's weather is \{ getFeelsLike() }, with a temperature of \{ getTemperature() } degrees \{ getUnit() }" ;
return STR.process(str);
字符串内插和字符串模板
更安全,相对于其他语言的字符串模板