授课语音

JDK 21 的文本模板特性

JDK 21 引入了文本模板(Text Blocks)的新特性,旨在简化字符串的处理,特别是多行字符串的书写和使用。文本模板的主要目的是提供一种更加直观和易读的方式来处理复杂的字符串,避免了传统字符串拼接和转义的繁琐,使得代码更加简洁。


1. 文本模板的基本概念

文本模板是用于表示多行字符串的语言特性。通过文本模板,程序员可以更方便地处理多行字符串,并且避免了传统字符串中需要多次转义字符的困扰。

文本模板的基本格式如下:

String text = """
    这是一个
    多行文本
    示例
    """;

1.1 文本模板的优点

  • 简化多行字符串的表示:无须在每行字符串后添加+号来拼接。
  • 减少转义字符:对于包含特殊字符(如双引号、反斜杠等)的字符串,可以直接书写而无需进行转义。
  • 提高代码可读性:多行字符串保留了格式,提升了代码的可读性,尤其适合SQL查询、JSON、HTML等内容。

2. JDK 21文本模板的基本语法

2.1 简单文本模板

文本模板的基础语法非常简单,通过三个双引号"""将多行文本括起来:

String message = """
    这是一段
    多行文本
    示例
    """;
System.out.println(message);

输出结果:

这是一段
多行文本
示例

2.2 内嵌文本模板

文本模板还支持内嵌表达式。通过${}语法,程序员可以将变量或方法结果插入到文本模板中。

String name = "张三";
int age = 30;
String text = """
    姓名:${name}
    年龄:${age}
    """;
System.out.println(text);

输出结果:

姓名:张三
年龄:30

代码解析:

  • ${name}${age}:这些是内嵌表达式,在运行时会被相应的变量值替代。

2.3 保留空格和换行

文本模板中的每一行的空格和换行都会被保留下来,因此可以更加灵活地控制文本的排版和格式。

String html = """
    <html>
        <head>
            <title>My Web Page</title>
        </head>
        <body>
            <h1>Hello, World!</h1>
        </body>
    </html>
    """;
System.out.println(html);

输出结果:

<html>
    <head>
        <title>My Web Page</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>

代码解析:

  • 该模板生成了格式良好的HTML文本,不需要手动拼接每一行。

3. 高级用法:控制文本模板的缩进

JDK 21 引入了通过 .stripIndent() 方法来控制文本模板的缩进。通过该方法,可以去掉模板文本的前导空白。

3.1 .stripIndent()方法

.stripIndent()方法会去掉每行文本的公共前导空白,常用于控制格式化的输出。

String text = """
    Hello, World!
        This is a test.
        This is a second line.
    """.stripIndent();

System.out.println(text);

输出结果:

Hello, World!
    This is a test.
    This is a second line.

代码解析:

  • stripIndent()去除了文本中的公共前导空白,但保留了每行内容的缩进。这样可以保证格式的一致性。

3.2 .translateEscapes()方法

该方法可以让文本模板中的特殊字符(如\n)转化为实际的字符,常用于处理JSON、SQL等场景。

String json = """
    {
        "name": "张三",
        "age": 30
    }
    """.translateEscapes();

System.out.println(json);

输出结果:

{
    "name": "张三",
    "age": 30
}

代码解析:

  • translateEscapes()方法会将文本模板中的转义字符(如\n)进行转换,保留原始格式。

4. 结合Spring Boot3 使用文本模板

4.1 集成文本模板的Spring Boot示例

假设我们在Spring Boot应用中需要处理动态生成的HTML内容,可以使用文本模板来简化HTML模板的处理。

4.1.1 Controller代码:BookController.java

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BookController {

    @GetMapping("/bookInfo")
    public String getBookInfo() {
        String bookTitle = "Java编程思想";
        String author = "Bruce Eckel";
        
        // 使用文本模板生成动态内容
        String html = """
            <html>
                <head>
                    <title>${bookTitle} - 信息</title>
                </head>
                <body>
                    <h1>${bookTitle}</h1>
                    <p>作者:${author}</p>
                </body>
            </html>
            """;
        return html;
    }
}

代码解析:

  • getBookInfo()方法生成了一个简单的HTML页面,页面标题和内容通过文本模板动态插入。
  • ${bookTitle}${author}在模板中作为占位符,自动替换为相应的变量值。

4.1.2 访问结果

当访问 /bookInfo 路径时,浏览器将返回以下HTML内容:

<html>
    <head>
        <title>Java编程思想 - 信息</title>
    </head>
    <body>
        <h1>Java编程思想</h1>
        <p>作者:Bruce Eckel</p>
    </body>
</html>

5. 总结

JDK 21 的文本模板特性大大简化了多行字符串的处理,特别是在需要插入动态内容(如变量、方法返回值等)时,文本模板的语法非常简洁易懂,且避免了繁琐的字符串拼接和转义问题。结合Spring Boot,可以方便地生成动态HTML、JSON等内容,提高了开发效率和代码的可读性。

  • 文本模板的基本语法:使用 """ 进行多行字符串的定义。
  • 内嵌表达式:支持通过 ${} 插入变量和方法调用结果。
  • 高级用法:提供 .stripIndent().translateEscapes() 方法来控制文本格式。

文本模板特性为开发者提供了更高效的字符串处理方式,特别是在构建动态内容和生成复杂文本时,表现出巨大的优势。

去1:1私密咨询

系列课程: