JDK21 字符串模板 String Templates

JEP 430 字符串插值

JDK 21 的一大功能是JEP 430,它是字符串插值语言的更改。它将允许编写如下代码:

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

  1. 该特性的设计目标是
    通过简单的方式表达混合变量的字符串,简化 Java 程序的编写。
    提高混合文本和表达式的可读性,无论文本是在单行源代码中(如字符串字面量)还是跨越多行源代码(如文本块)。
    通过支持对模板及其嵌入式表达式的值进行验证和转换,提高根据用户提供的值组成字符串并将其传递给其他系统(如构建数据库查询)的 Java 程序的安全性。
    允许 Java 库定义字符串模板中使用的格式化语法(java.util.Formatter ),从而保持灵活性。
    简化接受以非 Java 语言编写的字符串(如 SQL、XML 和 JSON)的 API 的使用。
    支持创建由字面文本和嵌入式表达式计算得出的非字符串值,而无需通过中间字符串表示。

  2. 不是什么
    我们的目标不是为 Java 的字符串连接操作符 (+) 引入语法增强。
    我们的目标不是废弃或移除 StringBuilder 和 StringBuffer 类,这两个类历来用于复杂或程序化的字符串组合。

之前采用的字符串写法:

  • 使用 + 运算符进行字符串连接会产生难以阅读的代码:
String s = x + " plus " + y + " equals " + (x + y);
  • StringBuilder
String s = new StringBuilder()
                 .append(x)
                 .append(" plus ")
                 .append(y)
                 .append(" equals ")
                 .append(x + y)
                 .toString();
STR 模板处理器

STR 是 Java 平台定义的一种模板处理器。它通过用表达式的(stringified)值替换模板中的每个嵌入表达式来执行字符串插值。使用 STR 的模板表达式的求值结果是一个字符串。

STR 是一个公共静态 final 字段,会自动导入到每个 Java 源文件中。

public class TestJdk21Main {

	public static void main(String[] args) {
		System.out.println("hello jdk21");
		TestJdk21Main.testStrMethod();
		TestJdk21Main.threadTest();
	}

	public static void testStrMethod() {
		String blog = "blog.didispace.com";
		String str = STR."My blog is \{blog}";
		System.out.println(str);

		TestJdk21Main.print(blog);

		System.out.println(STR."print \{TestJdk21Main.getStr(blog)}");

		System.out.println(STR."print \{TestJdk21Main.getStr( STR."My blog is \{blog}")}");
	}

	public static void print(String str){
		System.out.println( STR."My blog2 is \{str}");
	}

	public static String getStr(String str){
		return STR."My blog2 is \{str}";
	}

允许进行嵌套,和拼接,也可用于运算

// Embedded expressions can perform arithmetic
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";
程序结果:"10 + 20 = 30"

嵌套调用时:

// Embedded expressions can invoke methods and access fields
String s = STR."You have a \{getOfferType()} waiting for you!";
程序结果:"You have a gift waiting for you!"
String t = STR."Access at \{req.date} \{req.time} from \{req.ipAddress}";
程序结果:Access at 2022-03-25 15:34 from 8.8.8.8
JDK8 之前,Java字符串拼接的方式是使用 StringBuilder 或 StringBuffer 的 append() 方法进行拼接。但是在 JDK8 中,如果字符串拼接的表达式中只包含常量字符串,编译器会在编译时自动将其拼接为一个字符串常量,这个过程被称为编译期间的字符串拼接优化。 例如: ```java String str = "Hello" + " " + "World"; ``` 在编译时,会直接将其转化为: ```java String str = "Hello World"; ``` 对于包含变量或表达式的字符串拼接,JDK8 引入了一种新的方式,使用 StringJoiner、String.join() 或者 Stream API 的 collect() 方法进行拼接。这种方式相比于之前使用 StringBuilder 或 StringBuffer,能够更加高效地实现字符串拼接。 具体来说,StringJoiner 是一种用来拼接字符串序列的工具类,可以通过设置分隔符、前缀和后缀等属性来定制拼接结果的格式。例如: ```java StringJoiner sj = new StringJoiner(", ", "[", "]"); sj.add("apple"); sj.add("banana"); sj.add("orange"); String result = sj.toString(); ``` 输出结果为: ```java [apple, banana, orange] ``` String.join() 方法也可以实现类似的功能,例如: ```java String[] arr = {"apple", "banana", "orange"}; String result = String.join(", ", arr); ``` Stream API 的 collect() 方法也可以使用 Collectors.joining() 来实现字符串拼接,例如: ```java List<String> list = Arrays.asList("apple", "banana", "orange"); String result = list.stream().collect(Collectors.joining(", ", "[", "]")); ``` 这种方式相比于使用 StringBuilder 或 StringBuffer,能够更加高效地实现字符串拼接,因为它利用了 Stream API 中的并行计算能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离离原上草77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值