在Java中的字符串处理,一直是为人诟病的大问题。从使用+连接的大量String出现的性能问题,到满屏拼接的恶心的SQL等等。而用过Python的都知道,Python中提供的text 特性,是非常舒爽的一个特性,在Java13之后,也终于迎来了Text Blocks。
文本块是在JDK13和JDK14中,根据JEP355引入的一个preview级别语言特性。计划在JDK15中成为一个稳定的功能。文本块是跨越多行的字符串文字,它避免了大多数转义的问题。
动机
在Java中使用String拼接XML,JSON或者SQL都是噩梦般的存在。比如,一个只有两个键的简单JSON片段在Java中几乎不可读,因为代码看起来像这样:
Stringjson=
"{\n"+
"\"name\":\"john\",\n"+
"\"age\":42\n"+
"}";
文本块(Text Blocks)
使用新的文本块特性,上面的代码我们可以这样写:
Stringtext="""
{
"name":"john",
"age":"42"
}
""";
Text blocks are opened (and closed) using triple-quotes (“””). The text begins at the next line. After opening a text block, the rest of the line needs to stay empty.
文本块使用首尾的三个双引号开闭。文本块开始的三个双引号之后,不能有内容,文本另起一行开始。
如果我们使用console打印text,我们得到:
{
"name":"john",
"age":"42"
}
从打印结果可以发现,左边的缩进已经去掉了,这是因为文本块的处理步骤:
- 行结束符被规范化为LF字符。这避免了不同平台(如windows和unix)之间的问题。
- 删除附带的前导空格和所有尾随空格。附带的前导空白是通过找到所有行的前导空白的公共数目来确定的(所以上面示例中的前导缩进被删除了)。
- 解释转义符。文本块可以包含与标准字符串相同的转义序列(例如:\t或\n)。另外,添加了两个新的转义序列:用于显示空白的转义符:\s和作为继续指示符的转义符:\<eol>(稍后将详细介绍)。
注:
CR:Carriage Return,对应ASCII中转义字符\r,表示回车
LF:Linefeed,对应ASCII中转义字符\n,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。
如果明确需要前导空格,可以使用indent() 方法:
Stringtext="""
{
"name":"john",
"age":"42"
}
""".indent(4);
该方法显式的增加了4个前导空格,所以该text打印出来:
{
"name":"john",
"age":"42"
}
或者,我们可以从结束的三引号中删除4个前导空格以产生相同的结果:
Stringtext="""
{
"name":"john",
"age":"42"
}
"""; // <--删除前导4个空格,保持文本块中的前导空白
\<eol>转义符
新的\<eol>转义符可以将原本一行的内容拆分成多行来书写。
Stringtext="""
1
2\
3\
4
5
""";
结果:
1
234
5
转义三个引号
如果在文本块中要转义三个引号,只需要转义第一个引号即可:
Stringtext="""
Javatextblocksstartwith\"""
""";
打印输出:
Java text blocks start with """
小结
文本块是Java编程语言的一个很好的补充。它们可以极大地提高JSON、XML或SQL等嵌入式字符串的可读性。
所有代码已实测
原文链接:https://www.javacodegeeks.com/2020/06/java-text-blocks-2.html