拥抱Java 21—让字符串(String)类型的使用更方便

Java 21 已经在2023年9月19日正式发布了。Java 21是最新的LTS(Long Time Support)版本,因此还没发布时就引起了许多开发人员的关注。此次版本升级,一共有 15 个功能进行了更新。

在这 15 个功能更新中,有类似于 ZGC、虚拟线程等热门讨论的技术。但是对于一个普通开发人员来说,我比较感兴趣,也觉得最能覆盖日常使用的,反而是许多文章并未多少提及的字符串模板功能。这篇文章,我就来讲述为什么我认为字符串模板的引入,会让字符串类的使用更加便利;同时也会讲解,我们该如何借助这一特性,更好编写代码。

前置知识

  1. 字符串模板 功能目前仅是预览API,使用时候需要充分考虑到后续的升级和兼容性问题。

  2. 字符串模板在其他编程语言中都存在,并不是 Java 率先更新(事实上,Java 对于新功能的改动经常会很慢)。例如下面的语言中,就有很成熟的字符串模板功能:

C#             $"{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的数值,最后返回最后的字符串

我们该怎么做?通常来说,我们想要实现上面的要求,代码肯定是这样的

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 进行字符串拼接,可以直接在字符串中嵌入表达式,而无需进行额外的处理:

String name = "Juejiner";
String info = STR."My name is \{name}";

在上面的模板表达式中:

  • STR 是模板处理器。
  • \{name}为表达式,运行时,这些表达式将被相应的变量值替换。

在这篇文章中,我们看到官方目前提供了一共三种模板处理器:

  • STR:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。
  • FMT:和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式
  • RAW:不会像 STRFMT 模板处理器那样自动处理字符串模板,而是返回一个 StringTemplate 对象,这个对象包含了模板中的文本和表达式的信息
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 接口来创建自己的模板处理器。

在 这篇文章中,我们还可以知道,目前 字符串模板还支持函数和静态/非静态字段作为嵌入表达式,也可以直接在表达式中做计算。

//变量
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}";  

改造之前的代码

还记得我们最初的拼接字符串的内容吗?这次我们用字符串模板优化一下!

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 开启预览功能的使用。

你可能感兴趣的:(java)