Java 21 已经在2023年9月19日正式发布了。Java 21是最新的LTS(Long Time Support)版本,因此还没发布时就引起了许多开发人员的关注。此次版本升级,一共有 15 个功能进行了更新。
在这 15 个功能更新中,有类似于 ZGC、虚拟线程等热门讨论的技术。但是对于一个普通开发人员来说,我比较感兴趣,也觉得最能覆盖日常使用的,反而是许多文章并未多少提及的字符串模板功能。这篇文章,我就来讲述为什么我认为字符串模板的引入,会让字符串类的使用更加便利;同时也会讲解,我们该如何借助这一特性,更好编写代码。
前置知识
-
字符串模板 功能目前仅是预览API,使用时候需要充分考虑到后续的升级和兼容性问题。
-
字符串模板在其他编程语言中都存在,并不是 Java 率先更新(事实上,Java 对于新功能的改动经常会很慢)。例如下面的语言中,就有很成熟的字符串模板功能:
BASHC# $"{x} plus {y} equals {x + y}" Python f"{x} plus {y} equals {x + y}" JavaScript `${x} plus ${y} equals ${x + y}` Swift "(x) plus (y) equals (x + y)"
当前字符串的问题
对于日常的开发人员而言,拼接字符串String
用来生成最后的结果,是特别常见的需求。现在,我们有个需求:
将 str1,str2,str3,str4 拼接起来,并加上 a 和b的数值,最后返回最后的字符串
我们该怎么做?通常来说,我们想要实现上面的要求,代码肯定是这样的
JAVA
String str1="1";
String str2="2";
String str3="3";
String str4= "4";
int a =1;
int b = 1;
String result = "str1:"str1+",str2:"+str2+",str3:"+str3
+",str4:"+str4+",a:"+a+",b:"+b+",a+b:"+(a+b);
上面的代码正不正确?完全正确。但是,太不优雅了!
是的,除了+
的方式,我们还可以使用.format
或者 StringBuffer
亦或者是 StringBuilder
等方式。但是,底层逻辑不变,都是在拼接一个又一个枯燥无味而且容易出错的字符。
当代码中需要构建包含多个变量和表达式的复杂字符串,或者是要拼接的字符串内容很长或者结构复杂的时候,现在的字符串类型就容易出错(如忘记某些加号或正确处理空格等问题)。
那么,我们有没有一种方法,降低这种复杂且浪费时间的拼接过程呢?
JDK21 做了什么优化
在 JEP 430: String Templates (Preview) 中我们可以看到官方提出了一个叫字符串模板的新特性:Java 使用 String Templates 进行字符串拼接,可以直接在字符串中嵌入表达式,而无需进行额外的处理:
JAVA
String name = "Juejiner";
String info = STR."My name is {name}";
在上面的模板表达式中:
STR
是模板处理器。{name}
为表达式,运行时,这些表达式将被相应的变量值替换。
在这篇文章中,我们看到官方目前提供了一共三种模板处理器:
STR
:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。FMT
:和STR
类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式RAW
:不会像STR
和FMT
模板处理器那样自动处理字符串模板,而是返回一个StringTemplate
对象,这个对象包含了模板中的文本和表达式的信息
JAVA
String name = "Juejin";
//STR
String message = STR."Hello {name}.";
//FMT
String message = STR."Hello %-12s{name}.";
//RAW
StringTemplate st = RAW."Hello {name}.";
String message = STR.process(st);
进一步的,我们还可以发现,官方也预留了StringTemplate.Processor
接口来创建自己的模板处理器。
在 这篇文章中,我们还可以知道,目前 字符串模板还支持函数和静态/非静态字段作为嵌入表达式,也可以直接在表达式中做计算。
JAVA
//常量
message = STR."Greetings {name}!";
//方法
message = STR."Greetings {getName()}!";
//非静态字段
message = STR."Greetings {this.name}!";
//数据计算,最后结果为 "1+1=2"
int x = 1, y = 1;
String s = STR."{x} + {y} = {x + y}";
改造之前的代码
还记得我们最初的拼接字符串的内容吗?这次我们用字符串模板优化一下!
JAVA
String str1="1";
String str2="2";
String str3="3";
String str4= "4";
int a =1;
int b = 1;
String result = STR."str1:{str1},str2:{str2},str3:{str3},str4:{str4},a:{a},b:{b},a+b:{a+b}";
总结
JDK 21中的String Templates是Java语言的一个新特性,用于简化字符串的创建和拼接,允许你将变量和表达式嵌入到字符串文本中。这个特性类似于其他编程语言中的字符串插值或者模板字符串。简单来说,String Templates让你可以在字符串中直接插入变量或表达式,而不需要使用传统的字符串拼接方式。这使得代码更加整洁,易于阅读和维护。
注意: JDK21 中的字符串模板仍然是一个预览特性。你需要慎重考虑是否要使用!如果使用的话,选择要在启动时候增加 参数 --enable-preview
开启预览功能的使用。