行终止符
不同的平台有不同的行终止符。
Java 不会进入平台检测并将文本块中的所有行终止符规范化为 \n
。
如果需要平台行终止符,则可以使用`String::replaceAll("\n", System.lineSeparator())"。
String string = "Hello"; String textBlock = """ World"""; String joinedString = string + textBlock; joinedString = joinedString.replaceAll("\n", System.lineSeparator()); System.out.println(joinedString);
Java文本块缩进
文本块保留其内容的缩进。
为了实现这一点,JEP 将空间划分为偶然和必要的缩进。
为了在上下文中讨论,让我们参考第一个例子。
String dbSchema = """ CREATE TABLE 'TEST'.'EMPLOYEE' ( 'ID' INT NOT NULL DEFAULT 0 , 'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL , 'STAT_CD' TINYINT NOT NULL DEFAULT 0 ); """; System.out.println(dbSchema);
程序输出:
|CREATE TABLE 'TEST'.'EMPLOYEE' |( | 'ID' INT NOT NULL DEFAULT 0 , | 'FIRST_NAME' VARCHAR(100) NOT NULL , | 'LAST_NAME' VARCHAR(100) NULL , | 'STAT_CD' TINYINT NOT NULL DEFAULT 0 |);
在这里,我们有两种类型的缩进:
第一个缩进是从行首到所有行中的单词“CREATE”。
这可以根据各种因素增加或者减少,例如格式化插件或者开发人员的选择。
它是偶然的缩进。
第二个缩进是从字符'('
开始到'ID'
。
大部分时间是4或者8个空格。
为了保持文本块的缩进意图,这应该很荣幸。
这被称为基本缩进.
Java 文本块删除所有附带的缩进,只保留必要的缩进。
添加一些所需的缩进
让我们想象一下,我们想要为上面示例中的所有行左缩进 2 个制表符。
我们可以通过仔细定位关闭的三重引号以向左移动 2 个标签来做到这一点。
放置在与基本缩进应该拾取的完全相同的位置。
String dbSchema = """ CREATE TABLE 'TEST'.'EMPLOYEE' ( 'ID' INT NOT NULL DEFAULT 0 , 'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL , 'STAT_CD' TINYINT NOT NULL DEFAULT 0 ); """; System.out.println(dbSchema);
程序输出:
| CREATE TABLE 'TEST'.'EMPLOYEE' | ( | 'ID' INT NOT NULL DEFAULT 0 , | 'FIRST_NAME' VARCHAR(100) NOT NULL , | 'LAST_NAME' VARCHAR(100) NULL , | 'STAT_CD' TINYINT NOT NULL DEFAULT 0 | );
另请注意,文本块中每一行的尾随空格也会被 Java 编译器去除。
处理tab符号
不幸的是,编译器不难知道TAB 字符在不同的编辑器中是如何显示的。
因此,编译器将单个空格字符视为单个 TAB 字符,即使 TAB 字符可能导致最多相当于八个空格的空白。
文本块类似于String
- 从文本块生成的实例是
java.lang.String
类型,具有与传统双引号字符串相同的特征。这包括对象表示和插入字符串池。 - 我们可以使用文本块作为
String
类型的方法参数传递。 - 文本块可以在任何可以使用字符串文字的地方使用。例如,我们可以将它用于字符串连接。
String string = "Hello"; String textBlock = """ World"""; String joinedString = string + textBlock; System.out.println(joinedString);
输出:
Hello World
新的转义序列
转义行终止符
很多时候,我们只想将内容写入程序中的多行,但它们实际上是单个字符串内容。
在这种情况下,我们可以使用单反斜杠 '\'
的行终止符转义字符。
它禁止包含隐式换行符。
String dbSchema = """ CREATE TABLE 'TEST'.'EMPLOYEE'\ (\ 'ID' INT NOT NULL DEFAULT 0 ,\ 'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL ,\ 'STAT_CD' TINYINT NOT NULL DEFAULT 0 \ ); """; System.out.println(dbSchema);
程序输出:
|CREATE TABLE 'TEST'.'EMPLOYEE'('ID' INT NOT NULL DEFAULT 0 ,'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL ,'STAT_CD' TINYINT NOT NULL DEFAULT 0 );
在 Java 中,文本块是多行字符串文字。
这意味着我们不需要陷入混乱的显式行终止符、字符串连接和分隔符,否则用于编写普通字符串文字。
文本块语法
- 文本块由多行文本组成,并使用三个双引号字符 (""") 作为其开始和结束分隔符。
- 开头的三个双引号字符后面总是跟一个行终止符。
- 我们不能在一行中包含分隔符和文本块。开始定界符必须在它自己的行上。内容只能从下一行开始。
- 如果文本内容包含单引号或者双引号,则无需对其进行转义。
String dbSchema = """ CREATE TABLE 'TEST'.'EMPLOYEE' ( 'ID' INT NOT NULL DEFAULT 0 , 'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL , 'STAT_CD' TINYINT NOT NULL DEFAULT 0 ); """;
虽然上面的文本块看起来很简单,但在引擎下仍然发生了很多事情。