zoukankan      html  css  js  c++  java
  • Java 中的 3 个双引号是什么语法?Java 15 刷新你的认知!

    Java 中的 3 个双引号 """ 是什么语法?

    这是 Java 15 新出的,刷新你的认知!

    一、前言

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

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

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

    二、示例

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

    不使用 Text Blocks::

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

    使用 Text Blocks:

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

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

    再来看下字节码:

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

    三、详细介绍

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

    1、Line terminators(换行符)

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

    """
    Java
    line 2
    line 3
    """
    

    就等同于:

    "line 1
    line 2
    line 3
    "
    

    或者:

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

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

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

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

    String empty = """
    """;
    

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

    2、Incidental white space(空格编排)

    继续看上面那段代码:

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

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

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

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

    3、Escape sequences(转义字符)

    如下面代码所示:

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

    结果输出:

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

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

    不使用 Text Blocks:

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

    使用 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 中新增了直接格式化字符串的方法:

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

    对文本块感兴趣的、想深入了解更多文本块细节的同学,可以参考官方说明:

    https://openjdk.java.net/jeps/378

    官方介绍文本块用了 3 万多字……可想而知解读它的难度。

    本次栈长的分享就到这里了,希望对大家有用。觉得不错,在看、转发分享一下哦~

    最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。
    近期热文推荐:

    1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    4.吊打 Tomcat ,Undertow 性能很炸!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    学会拒绝,把时间用在更重要的事情上
    5G即将到来!我们需要一部怎样的手机呢?
    互联网早期是如何发展起来的?
    程序员需要明白这九件事
    centos7安装出现license information(license not accepted)解决办法
    CentOS6.5下安装MySql5.7.17
    Linux操作系统下MySQL的安装 --转
    SecureCRT_教程--1(windows远程登录linux)
    CentOS-7中安装与配置Tomcat8.5
    CentOS7使用firewalld打开关闭防火墙与端口
  • 原文地址:https://www.cnblogs.com/javastack/p/13876948.html
Copyright © 2011-2022 走看看