在Java中,文本块是多行字符串文字。这意味着我们不需要陷入显式的行终止符,字符串连接以及分隔符的混乱局面,而这些分隔符通常用于编写普通的字符串文字。
Java 文本块在Java 13中可用( JEP 355 )和Java 14( JEP 368 )作为预览函数。它计划成为Java 15的标准函数( JEP 378 ) 。
要启用此预览函数,我们必须使用 -enable-preview 和 -source 14 (两个连字符)标志。
文本块语法
文本块包含多行文本,并使用三个双引号字符(""")作为其开始和结束定界符。
开头的三个双引号字符后总是一个行终止符。
我们不能在一行上包含定界符和文本块。分隔符必须在自己的行上。内容只能从下一行开始。
如果文本内容包含单引号或双引号,则无需将其转义。
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 ); """;
尽管上面的文本块看起来非常简单,但仍然有很多事情发生在幕后。让我们来探索。
类似字符串
从文本块生成的实例的类型为
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 |);
在这里,我们有两种缩进类型:
第一个缩进是从行首到所有行中的" CREATE"
字。可能会根据各种因素(例如格式化插件或开发者的选择)而增加或减少。
第二次缩进是从字符'('
'到'ID'
的开始。在大多数情况下,缩进时间为4或8个空格。
添加一些缩进
假设我们想在上面的示例中为所有行在左侧添加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编译器还会删除文本块中每一行上的尾随空格。
行终止符
不同的平台具有不同的行终止符。 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);
转义序列
很多时候,我们只想将内容写到程序的多行中,但实际上它们只是一个字符串内容。在这种情况下,我们可以使用换行符换码符,即单个反斜杠'\'
。它禁止包含隐式换行符。
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 );
如果由于某种原因我们不希望删除缩进,可以使用'\s'
(ASCII字符32,空格)转义序列。在任何行的末尾使用它可以保证该行将具有所有空格字符,直到遇到'\s'
。
String dbSchema = """ CREATE TABLE 'TEST'.'EMPLOYEE' \s ( \s 'ID' INT NOT NULL DEFAULT 0 , \s 'FIRST_NAME' VARCHAR(100) NOT NULL , \s 'LAST_NAME' VARCHAR(100) NULL , \s 'STAT_CD' TINYINT NOT NULL DEFAULT 0 \s ); \s """; System.out.println(dbSchema.replaceAll("\s", "."));
程序输出。 在此程序输出中,我将所有空格字符替换为点'.' 让您了解其效果。
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... );.......................................