1. 程式人生 > >Java 中的 3 個雙引號是什麼語法?Java 15 重新整理你的認知!

Java 中的 3 個雙引號是什麼語法?Java 15 重新整理你的認知!

Java 中的 3 個雙引號 """ 是什麼語法? 這是 Java 15 新出的,重新整理你的認知! ## 一、前言 在 [Java 15](https://mp.weixin.qq.com/s/fCwOQJxOYiqlnEZjqiFt2Q) 的推出的時候,`Text Blocks` 正式轉正,我叫它 “文字塊” 好了,棧長也做了簡單介紹,沒看過的可以點選[這裡](https://mp.weixin.qq.com/s/fCwOQJxOYiqlnEZjqiFt2Q)看下。 文字塊,是一個多行字串,它可以避免使用大多數轉義符號,自動以可預測的方式格式化字串,並讓開發人員在需要時可以控制格式。 文字塊最早準備在 JDK 12 新增的,但最終撤消了,然後在 JDK 13 中作為預覽特性進行了新增,然後又在 JDK 14 中再次預覽,在 JDK 15 中,文字塊終於轉正,暫不再做進一步的更改。 ## 二、示例 來看下這個 HTML 語言示例你就懂了: **不使用 Text Blocks::** ``` String html1 = "\n" + " \n" + "

Hi, Java技術棧

\n" + "

歡迎關注,分享更多幹貨

\n" + " \n" + "\n"; ``` **使用 Text Blocks:** ``` String html2 = """

Hi, Java技術棧

歡迎關注,分享更多幹貨

"""; ``` 文字塊需要用三個雙引號包起來,熟悉 Python 的都知道,三個雙引號表示多行註釋,沒想到 Java 竟然用作了多行字串…… 再來看下位元組碼: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095334150-775593392.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(空格編排) 繼續看上面那段程式碼: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095334848-830338015.png) 注意這根線沒有,線前面有一排空格,意味著是不會被編譯進去的,只是用來縮排格式化方便閱讀,所以我叫它空格編排。 如果 """ 在最後單獨佔一排,則以它左對齊,否則以最靠左的一列左對齊。 ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095335166-582352714.png) ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095335481-408210430.png) IDEA 真是強大啊,對 JDK 15 都支援這麼好了。如果你說沒啟用碼,這都不是事,可以關注公眾號Java技術棧,回覆:idea,棧長教你免費獲取正版。 另外,Java 15 中新增了 `String.stripIndent` 例項方法,可以直接刪除每一行的開頭和結尾空白字元。 #### 3、Escape sequences(轉義字元) 如下面程式碼所示: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095335801-1610508838.png) 我在程式碼中又增加了 `\s`、`\n`、`\t` 之類的轉義字元,可以直接拿來用,雙引號也不需要轉義。 結果輸出: ```

Hi, "Java技術棧"

歡迎關注,\分享"更多"乾貨

``` 實際工作中可能出現的 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 中新增了直接格式化字串的方法: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201026095336118-873473749.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(文字塊)遠比想象中要難很多,沒想到一個文字塊這麼多細節,文中只是對文字塊作了一個部分總結,並不是文字塊的全部內容,反正暫時也用不到,大家簡單瞭解即可。 對文字塊感興趣的、想深入瞭解更多文字塊細節的同學,可以參考官方說明: > https://openjdk.java.net/jeps/378 **官方介紹文字塊用了 3 萬多字……可想而知解讀它的難度。** 本次棧長的分享就到這裡了,希望對大家有用。覺得不錯,在看、轉發分享一下哦~ 最後,Java 系列教程還會繼續更新,關注Java技術棧公眾號第一時間推送,還可以在公眾號選單中獲取歷史 Java 教程,都是乾貨。 **近期熱文推薦:** 1.[Java 15 正式釋出, 14 個新特性,重新整理你的認知!!](http://www.javastack.cn/article/2020/java15-released/) 2.[終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!](http://www.javastack.cn/article/2020/intellij-idea-by-open-source-project/) 3.[我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。](http://www.javastack.cn/article/2020/java-8-optional-map-do-you-know/) 4.[吊打 Tomcat ,Undertow 效能很炸!!](http://www.javastack.cn/article/2020/undertow-introduce-with-spring-boot/) 5.[《Java開發手冊(嵩山版)》最新發布,速速下載!](http://www.javastack.cn/article/2020/alibaba-release-java-develop-rules-songshan/) 覺得不錯,別忘了隨手點贊+轉發哦!