java文本框字符变星号 (java文本块)

在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"
}

从打印结果可以发现,左边的缩进已经去掉了,这是因为文本块的处理步骤:

  1. 行结束符被规范化为LF字符。这避免了不同平台(如windows和unix)之间的问题。
  2. 删除附带的前导空格和所有尾随空格。附带的前导空白是通过找到所有行的前导空白的公共数目来确定的(所以上面示例中的前导缩进被删除了)。
  3. 解释转义符。文本块可以包含与标准字符串相同的转义序列(例如:\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