java15新特性-文本块

java13新特性—文本块(预览)

Java 13 提供了文本块(Text Blocks) 预览特性。该特性会方便开发者编写多行字符串。该特性的具体介绍见 JEP 355。

注意,是预览特性,默认不支持。

了解 Python 的同学会对这个特性比较熟悉,不过 Java 的这个特性与 Python 不完全相同。比如”””你好”””这种不换行的写法是不支持的

  • 示例1
public class TestMultiLineStr {

public static void main(String[] args) {
String data = """
你好
世界
""";
System.out.printf(data);
}
}

编译、执行时候,需要加上–enable-preview参数,多行的相同空白前缀会被去掉

$ javac --release 13 --enable-preview TestMultiLineStr.java
$ java13 --enable-preview TestMultiLineStr
你好
世界
  • 示例2
public class TestMultiLineStr {

public static void main(String[] args) {
String data = """
你好
世界
""";
System.out.printf(data);
}
}
  • 示例3
public class TestMultiLineStr {

public static void main(String[] args) {
String data = """
你好
世界""";
System.out.printf(data);
}
}
  • 示例4
public class TestMultiLineStr {

public static void main(String[] args) {
String data = """
你好" "
世界''
""";
System.out.printf(data);
}
}
你好"  "
世界''
  • 不支持的写法
String data = """你好""";  // 不支持


String data = """你好
世界
"""; // 不支持
  • 文本块方法
  1. stripIndent() - 从字符串的开头和结尾删除附带的空格。

  2. translateEscapes() - 根据字符串语法翻译转义序列。

  3. formatted() - 类似于 String format() 方法以支持文本块字符串中的格式化。

java14新特性-增强文本块(第二次预览)

Text Blocks是在JDK13中以第一次预览版本引入的。现在在JDK14中是第二次预览版本 JEP 368: Text Blocks。

Indentation编排

  • 将代码中空格用.进行标识
String html = """
..............<html>
.............. <body>
.............. <p>Hello, world</p>
.............. </body>
..............</html>
..............""";
  • Indentation的规则就是以最下面的"""为界,对每一行都移除相同数量的空格
<html>
<body>
<p>Hello, world</p>
</body>
</html>

上面的例子,最下面的”“”刚好在最左边的位置,如果把“”“向右移动4个空格,我们看到输出结果是不变的,这样我们又得到一条结论:
如果”“”向右移动,则以text block中最左的那一行记录为准。
如果我们把“”“向左移动四位,就会发现最终的输出结果每行前面都有四个空格。
这个功能是和String添加的新的String::stripIndent()对应的。

Escaping转义

@Test
public void useEscape(){
String code =
"""
"
""
\s\s\s\s\s保留这行前面的空白
String text = \"""
这里展示的是escape的用法!
\""";
跟大家说个密码,这一行很长,我准备分行\
来写,哈哈!
""";
log.info("{}",code);
}

输出结果:


""
保留这行前面的空白
String text = """
这里展示的是escape的用法!
""";
跟大家说个密码,这一行很长,我准备分行来写,哈哈!

首先可以看到一个双引号和两个双引号都是不用转义的,直接写就行了。三个双引号就需要转义了。
另外\s表示的是一个空格。在需要的时候可以使用。
在一行结尾直接插入\,表示这一行太长了,还没结束。

  • 注意在Text Block中,不管是windows的回车,换行符还是linux的换行符都会转义成为换行符。这个转义功能也对应了String的新方法translateEscapes()

formatted格式化

@Test
public void useMethod(){
String query1 = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = '%s'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";

log.info(query1.formatted("我是一个参数"));
}
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = '我是一个参数'
ORDER BY `EMP_ID`, `LAST_NAME`;

java15新特性—文本块(正式)