Java 中的 3 個雙引號 """ 是什么語法?
這是 Java 15 新出的,重繪你的認知!
一、前言
在 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 竟然用作了多行字串……
再來看下位元組碼:

看到了吧?文本塊編譯后會自動添加換行符,和原始的拼接寫法編譯結果一致,再也不用再拼接字串了,
三、詳細介紹
其實文本塊的作用遠不止換行符這么簡單,下面堆疊長詳細介紹下,
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(空格編排)
繼續看上面那段代碼:

注意這根線沒有,線前面有一排空格,意味著是不會被編譯進去的,只是用來縮進格式化方便閱讀,所以我叫它空格編排,
如果 """ 在最后單獨占一排,則以它左對齊,否則以最靠左的一列左對齊,


IDEA 真是強大啊,對 JDK 15 都支持這么好了,如果你說沒激活碼,這都不是事,可以關注公眾號Java技術堆疊,回復:idea,堆疊長教你免費獲取正版,
另外,Java 15 中新增了 String.stripIndent 實體方法,可以直接洗掉每一行的開頭和結尾空白字符,
3、Escape sequences(轉義字符)
如下面代碼所示:

我在代碼中又增加了 \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 中新增了直接格式化字串的方法:

對上面的 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開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/191699.html
標籤:Java
上一篇:【踩坑系列】使用long型別處理金額,科學計數法導致金額轉大寫例外
下一篇:成為最差開發者的10條建議
