在 Java 中,文本块是多行字符串文本。这意味着我们不需要陷入显式行终止符,字符串串联和分隔符的混乱,否则用于编写正常的字符串文本。
Java 文本块在 Java 13 (JEP 355) 和 Java 14 (JEP 368) 中作为预览功能提供。它计划成为 Java 15 (JEP 378) 中的标准功能。
若要启用此预览功能,我们必须使用 –启用预览和 –source 14(两个连字符)标志。
1. 文本块语法
- 文本块包含多行文本,并使用三个双引号字符 (“”“) 作为其开始和结束分隔符。
- 开头的三个双引号字符始终后跟一行终止符。
- 我们不能在一行上放置分隔符和文本块。开头分隔符必须位于其自己的行上。内容必须仅从下一行开始。
- 如果文本内容包含单引号或双引号,则无需对其进行转义。
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
);
"" ";
|
虽然上面的文本块看起来非常简单,但仍然有很多事情发生在引擎盖下。让我们来探索一下。
2. 文本块类似于字符串
- 从文本块生成的实例的类型与传统的双引号字符串具有相同的特征。这包括对象表示和暂入字符串池。
java.lang.String
- 我们可以使用文本块作为方法参数传递类型 。
String
- 文本块可以在可以使用字符串文本的任何位置使用。例如,我们可以将其用于字符串串联。
String string = "Hello" ;
String textBlock = "" "
World "" ";
String joinedString = string + textBlock;
System.out.println(joinedString);
|
程序输出。
Hello
World
|
3. 缩进
3.1. 附带和必要的缩进
文本块保留其内容的缩进。为此,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"
第二个缩进是从字符开始到 。大多数时候是4或8个空间长。为了保持文本块缩进的意图,应该尊重这一点。这称为基本缩进。'('
'ID'
Java 文本块会删除所有附带的缩进,只保留必要的缩进。
3.2. 添加一些所需的缩进
让我们想象一下,我们要为上面示例中的所有行提供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 编译器也会去除文本块中每一行上的尾随空格。
3.3. 处理选项卡
遗憾的是,编译器不难知道 TAB 字符在不同编辑器中的显示方式。
因此,编译器将单个空格字符视为与单个 TAB 字符相同,即使 TAB 字符可能导致空格等效于最多八个空格。
4. 线路终结者
不同的平台有不同的行终止符字符。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);
|
5. 新的转义序列
5.1. 逃生线终结器
很多时候,我们只想将内容写入程序中的多行,但它们实际上是单个字符串内容。在这种情况下,我们可以使用行终止符转义字符,它是 单反斜杠 。它禁止包含隐式换行符。'\'
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 );
|
5.2. 向右剥离事件空间
如果由于某种原因我们不想去除缩进,我们可以使用(ASCII字符32,空格)转义序列。在任何行的末尾使用它可以保证该行将具有所有空格字符,直到遇到为止。'\s'
'\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 ...
);.......................................
|
6. 最佳实践
- 仅当文本块可以提高代码的清晰度时才使用文本块,特别是对于多行字符串。
- 如果字符串适合用例,则始终首选使用字符串。它们更有利于应用程序性能。
- 要保持所需的缩进,请始终使用相对于内容上最后一行的位置关闭三重引号的位置。
- 避免在复杂表达式(如 lambda 表达式或流操作)中使用内联文本块,以保持可读性。考虑重构为局部变量或静态最终字段。
- 仅使用空格或仅使用制表符来缩进文本块。混合空格将导致不规则缩进的结果。
在评论中给我您的问题。
快乐学习!!
引用: