java13新特征:文本块(Text Blocks)详解
2019-11-25 本文已影响0人
安静的猫咪先生
摘要:本文介绍了java13新特征文本块(Text Blocks)以及使用细节。文章难度:初级
![](https://img.haomeiwen.com/i1969029/3d8233fa7d677ceb.jpg)
2019年9月,java13正式发布。文本块(预览功能)是新特征之一。这个特征很好理解,笔者不废话了,直接上代码:
System.out.println("""
Hello,
multiline
text blocks!
""");
输出结果:
Hello,
multiline
text blocks!
这种多行字符串文字功能很实用,尤其是写json或sql的时候:
String json = """
{
greeting: "hello",
audience: "text blocks",
punctuation: "!"
}
""";
文本块就这么简单。使用时需要注意一下几点:
- 语法
- 缩进
- 转义
- 行结尾
- 格式化
- 预览功能
语法
- 以 """ 开始,从新的一行开始字符串的内容。这里的新起的这行不属于字符串,只表示内容开始,是语法的一部分。
- 以 """ 结束。 """ 可以紧跟字符串内容,也可以另起一行。另起一行时,字符串内容最后会留有一新行。
System.out.println("""
Hello, multiline text blocks!""");
// 结果
// > Hello, multiline text blocks!
System.out.println("""
Hello, multiline text blocks!
""");
// 结果
// > Hello, multiline text blocks!
// >
- 文本块创建的string与非文本块string完全一样
String s1 = """
Hello, text blocks!""";
String s2 = "Hello, text blocks!";
System.out.println("equal: " + s1.equals(s2)); // true
System.out.println("identical: " + (s1 == s2)); // true
缩进
java编译器会自动删除不需要的缩进:
- 每行结尾的空格都会删除
- 每行开始的共有的空格会自动删除
- 只保留相对缩进。
System.out.println("""
Hello,
multiline
text blocks!
""");
// 结果
// > Hello,
// > multiline
// > text blocks!
// >
System.out.println("""
Hello,
multiline
text blocks!
""");
// 结果
// > Hello,
// > multiline
// > text blocks!
// >
- 新行 """ 结束时,将 """ 向左调整,则可以给所有行前加相应数量的空格。将 """ 向右调整,没有作用。
System.out.println("""
Hello,
multiline
text blocks!
""");
// 结果
// > Hello,
// > multiline
// > text blocks!
// >
转义
使用文本块不用对换行符 \n 和双引号 \" 进行转移,但其他的转义仍需要
System.out.println("""
{
greeting: "hello",
audience: "text blocks",
punctuation: "!"
}
""");
// 结果
// > {
// > greeting: "hello",
// > audience: "text blocks",
// > punctuation: "!"
// > }
// >
如果要转移""" 使用\"""
String s= """
one: "
two: ""
three: \"""
""";
行结尾
Windows和基于UNIX的操作系统具有不同的字符来表示行结尾。
Windows使用回车符 \r 和换行符 \n ,而基于Unix的系统仅使用换行符 \n。
文本块中的所有行结尾将统一为换行符 \n。
格式化
java13给String对象提供了一个新的格式化方法formatted:
// 以前的format方法
String.format(" Hello \n %s \n text blocks!", "multiline");
// 新的formatted方法
String s = """
Hello
%s
text blocks!
""".formatted("multiline");
预览功能
文本块目前还是java13的预览功能
预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现且非常无常。它在JDK功能版本中提供,可根据实际使用情况激发开发人员的反馈; 这可能会导致它在未来的Java SE平台中成为永久性的。
在下一个JDK功能发布之前,将评估该功能的“真实世界”优势和劣势,以确定该功能是否在Java SE平台中具有长期作用,如果是,则是否需要优化。因此,该特征可以被授予最终和永久状态(有或没有改进),或者经历进一步的预览时段(有或没有改进),或者被移除。
所以,文本块特征在JDK13中提供,但默认情况下不启用。需要明确允许使用它们。maven开启预览功能的配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>13</release>
<compilerArgs>--enable-preview</compilerArgs>
</configuration>
</plugin>
总结:
- 文本块提供了一种创建多行字符串的便捷方式。
- 文本块创建的字符串与原来的字符串完全一样。
- 创建文本块,只需用 """。开始必须新起一行;结尾可以新起一行。
- 文本块自动删除行尾空格和行开始的共有空格,仅保留相对缩进。
- 行结尾进行统一。
- 增加了新格式化方法formatted
- Java 13中的预览功能,需要明确启用。
(完)