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

你可能感兴趣的:(java,开发语言,java)