Java 中的 3 个双引号是什么语法?Java 15 刷新你的认知!

简介: 在 Java 15 的推出的时候,Text Blocks 正式转正,我叫它 “文本块” 好了,栈长也做了简单介绍,没看过的可以点击这里看下。文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。

一、前言

在 Java 15 的推出的时候,Text Blocks 正式转正,我叫它 “文本块” 好了,栈长也做了简单介绍,没看过的可以点击这里看下。


文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。


文本块最早准备在 JDK 12 添加的,但最终撤消了,然后在 JDK 13 中作为预览特性进行了添加,然后又在 JDK 14 中再次预览,在 JDK 15 中,文本块终于转正,暂不再做进一步的更改。


二、示例

来看下这个 HTML 语言示例你就懂了:


不使用 Text Blocks::

String html1 = "<html>\n" +
              "    <body>\n" +
              "        <p>Hi, Java技术栈</p>\n" +
              "        <p>欢迎关注,分享更多干货</p>\n" +
              "    </body>\n" +
              "</html>\n";

使用 Text Blocks:

String html2 = """
              <html>
                  <body>
                      <p>Hi, Java技术栈</p>
                      <p>欢迎关注,分享更多干货</p>
                  </body>
              </html>
              """;

文本块需要用三个双引号包起来,熟悉 Python 的都知道,三个双引号表示多行注释,没想到 Java 竟然用作了多行字符串……


再来看下字节码:

image.png


看到了吧?文本块编译后会自动添加换行符,和原始的拼接写法编译结果一致,再也不用再拼接字符串了。


三、详细介绍

其实文本块的作用远不止换行符这么简单,下面栈长详细介绍下。


1、Line terminators(换行符)

如上面介绍,编译期自动增加换行符可以用来增强用非 Java 语言编写的代码的字符串的可读性,比如我们经常要拼接 HTML、XML、SQL 语言代码等,代码非常难看。

"""
Java
line 2
line 3
"""

就等同于:

"line 1\nline 2\nline 3\n"

或者:

"line 1\n" +
"line 2\n" +
"line 3\n"

如果最后一行不需要换行,可以这么写:

"""
line 1
line 2
line 3"""

还可以定义一个空的文本块:

String empty = """
""";

一个空字符串也需要两行代码,所以这个方式是不推荐使用的。


2、Incidental white space(空格编排)

继续看上面那段代码:


image.png


注意这根线没有,线前面有一排空格,意味着是不会被编译进去的,只是用来缩进格式化方便阅读,所以我叫它空格编排。


如果 """ 在最后单独占一排,则以它左对齐,否则以最靠左的一列左对齐。


image.png


IDEA 真是强大啊,对 JDK 15 都支持这么好了。如果你说没激活码,这都不是事,可以关注公众号Java技术栈,回复:idea,栈长教你免费获取正版。


另外,Java 15 中新增了 String.stripIndent 实例方法,可以直接删除每一行的开头和结尾空白字符。


3、Escape sequences(转义字符)

如下面代码所示:

image.png


我在代码中又增加了 \s、\n、\t 之类的转义字符,可以直接拿来用,双引号也不需要转义。


结果输出:

<html>
    <body>
        <p>Hi,     "Java技术栈"</p>
        <p>欢迎关注,\分享"更多"干货</p>
    </body>
   </html>

实际工作中可能出现的 SQL 语句的拼写就有救了!


不使用 Text Blocks:

String query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE_TB\"\n" +
               "WHERE \"CITY\" = 'INDIANAPOLIS'\n" +
               "ORDER BY \"EMP_ID\", \"LAST_NAME\";\n";

使用 Text Blocks:

String query = """
               SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
               WHERE "CITY" = 'INDIANAPOLIS'
               ORDER BY "EMP_ID", "LAST_NAME";
               """;

当然,拼接 SQL 要注意别造成 SQL 注入漏洞了,这里只是介绍使用。


另外,Java 15 新增了一个 String.translateEscapes 转义方法,可以直接对字符串内容进行转义。


4、格式化参数

Java 15 之前格式化字符串中的参数需要使用 String.format 静态方法,感觉不是很方便,而在 Java 15 中新增了直接格式化字符串的方法:


image.png


对上面的 SQL 语句进行扩展下,参数使用占位符进行格式化:

String query = """
               SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
               WHERE "CITY" = '%s' AND author = '%s'
               ORDER BY "EMP_ID", "LAST_NAME";
               """;
        System.out.println(query.formatted("深圳", "栈长"));

结果输出:

SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = '深圳' AND author = '栈长'
ORDER BY "EMP_ID", "LAST_NAME";

直接使用字符串对象的 formatted 实例方法感觉更方便了!

四、结语

解读 Text Blocks(文本块)远比想象中要难很多,没想到一个文本块这么多细节,文中只是对文本块作了一个部分总结,并不是文本块的全部内容,反正暂时也用不到,大家简单了解即可。

相关文章
|
18天前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
48 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
5天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
17 3
|
1月前
|
Java 数据安全/隐私保护
java之基本语法
java之基本语法
23 6
|
1月前
|
存储 Java 容器
Java 基础语法
Java是一种面向对象的编程语言,其基础语法包括类和对象、方法、变量、控制流语句、继承和多态以及异常处理。代码需写在类中,`main()`方法是程序入口,变量用于存储数据,控制流语句控制程序执行流程,继承和多态增强代码灵活性,异常处理保证程序稳定性。掌握这些知识可帮助您编写简单的Java程序。
|
2月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
24 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
2月前
|
存储 前端开发 JavaScript
【前端学JAVA】有手就会!10min快速入门java的基础语法(2)
【8月更文挑战第8天】10min快速入门java的基础语法
34 2
【前端学JAVA】有手就会!10min快速入门java的基础语法(2)
|
1月前
|
安全 前端开发 Java
浅析JVM invokedynamic指令与Java Lambda语法的深度融合
在Java的演进历程中,Lambda表达式无疑是Java 8引入的一项革命性特性,它极大地简化了函数式编程在Java中的应用,使得代码更加简洁、易于阅读和维护。而这一切的背后,JVM的invokedynamic指令功不可没。本文将深入探讨invokedynamic指令的工作原理及其与Java Lambda语法的紧密联系,带您领略这一技术背后的奥秘。
25 1
|
2月前
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
122 0
【aspose-words】Aspose.Words for Java模板语法详细剖析
|
2月前
|
安全 Java 编译器
Java 基础语法-面试题(53道)(基础概念+基础语法+流程控制)
Java 基础语法-面试题(53道)(基础概念+基础语法+流程控制)
59 18
|
2月前
|
Java
Java 基础语法-面试题(54-63道)(数组+类+包)
Java 基础语法-面试题(54-63道)(数组+类+包)
40 16