更新時(shí)間:2023-07-11 來(lái)源:黑馬程序員 瀏覽量:
Text Blocks首次是在JDK 13中以預(yù)覽功能出現(xiàn)的,然后在JDK 14中又預(yù)覽了一次,終于在JDK 15中被確定下來(lái),可放心使用了。
文本塊是一種多行字符串文字,它避免了大多數(shù)轉(zhuǎn)義序列的需要,以一種可預(yù)測(cè)的方式自動(dòng)設(shè)置字符串的格式,并在需要時(shí)使開(kāi)發(fā)人員可以控制格式,簡(jiǎn)化編寫 Java 程序的任務(wù)。
文本塊建議的目標(biāo)是提高 Java 程序中的字符串的可讀性,這些字符串表示以非 Java 語(yǔ)言編寫的代碼。
另一個(gè)目標(biāo)是支持從字符串文本遷移,規(guī)定任何新構(gòu)造都可以表達(dá)與字符串文本相同的字符串集,解釋相同的轉(zhuǎn)義序列,并且以與字符串文本相同的方式進(jìn)行操作。OpenJDK 開(kāi)發(fā)人員希望添加轉(zhuǎn)義序列來(lái)管理顯式空白和換行控件。
在Java中,在字符串文字中嵌入HTML,XML,SQL或JSON片段,通常需要先進(jìn)行轉(zhuǎn)義和串聯(lián)的大量編輯,然后才能編譯包含該片段的代碼。該代碼段通常難以閱讀且難以維護(hù),因此,如果具有一種語(yǔ)言學(xué)機(jī)制,可以比多行文字更直觀地表示字符串,而且可以跨越多行,而且不會(huì)出現(xiàn)轉(zhuǎn)義的視覺(jué)混亂,那么這將提高廣泛Java類程序的可讀性和可寫性。從JDK13到JDK14開(kāi)始文本塊新特性的提出,提高了Java程序書寫大段字符串文本的可讀性和方便性。
文本塊作為預(yù)覽特性首次引入Java 13后收到了眾多最終用戶的反饋。現(xiàn)在,文本塊得到了增強(qiáng),再次作為預(yù)覽特性出現(xiàn)在Java 14中,目標(biāo)成為未來(lái)JDK版本的標(biāo)準(zhǔn)特性。使用文本塊可以輕松表達(dá)跨多行源代碼的字符串。它提高了Java程序中以非Java語(yǔ)言編寫的代碼的字符串的可讀性;它約定,任何新構(gòu)造的文本塊都可以用字符串相同的字符集表示,解釋相同的轉(zhuǎn)義序列并以與字符串相同的方式進(jìn)行操作。下面看文本塊的引入方法和字符串的區(qū)別和不同:String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n";使用“二維”文本塊引入Hello, world 文字
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """; System.out.println(""" Hello, itheima text blocks! """);文本塊是Java語(yǔ)言的新語(yǔ)法,可以用來(lái)表示任何字符串,具有更高的表達(dá)能力和更少的復(fù)雜度。文本塊的開(kāi)頭定界符是由三個(gè)雙引號(hào) """ 開(kāi)始,從新的一行開(kāi)始字符串的內(nèi)容。這里的新起的這行不屬于字符串,只表示內(nèi)容開(kāi)始,是語(yǔ)法的一部分。以 """結(jié)束。 """可以緊跟字符串內(nèi)容,也可以另起一行。另起一行時(shí),字符串內(nèi)容最后會(huì)留有一新行。
line 1 line 2 line 3
等效于字符串文字:
"line 1\nline 2\nline 3\n"或字符串文字的串聯(lián):
"line 1\n" + "line 2\n" + "line 3\n"如果在字符串的末尾不需要行終止符,則可以將結(jié)束定界符放在內(nèi)容的最后一行。例如,文本塊:
line 1 line 2 line 3"""等效于字符串文字:
"line 1\nline 2\nline 3"文本塊可以表示空字符串,盡管不建議這樣做,因?yàn)樗枰獌尚性创a:
String empty = """ """;
以下是一些格式錯(cuò)誤的文本塊的示例:
String a = """"""; // no line terminator after opening delimiter String b = """ """; // no line terminator after opening delimiter String c = """ "; // no closing delimiter (text block continues to EOF) String d = """ abc \ def """; // unescaped backslash (see below for escape processing)
使用原始字符串語(yǔ)法:
String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n";
使用文本塊文本塊語(yǔ)法:
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
使用原始的字符串語(yǔ)法:
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" + "WHERE `CITY` = 'INDIANAPOLIS'\n" + "ORDER BY `EMP_ID`, `LAST_NAME`;\n";
使用文本塊語(yǔ)法:
String query = """ SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; """;
多語(yǔ)言示例
使用原始的字符串語(yǔ)法:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval("function hello() {\n" + " print('\"Hello, world\"');\n" + "}\n" + "\n" + "hello();\n");
使用文本塊語(yǔ)法:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(""" function hello() { print('"Hello, world"'); } hello(); """);
java編譯器會(huì)自動(dòng)刪除不需要的縮進(jìn):
- 每行結(jié)尾的空格都會(huì)刪除
- 每行開(kāi)始的共有的空格會(huì)自動(dòng)刪除
- 只保留相對(duì)縮進(jìn)。
System.out.println(""" Hello, itheima text blocks! """); // 結(jié)果 // > Hello, // > itheima // > text blocks! // > System.out.println(""" Hello, itheima text blocks! """); // 結(jié)果 // > Hello, // > itheima // > text blocks! // >
- 新行"""結(jié)束時(shí),將"""向左調(diào)整,則可以給所有行前加相應(yīng)數(shù)量的空格。將"""向右調(diào)整,沒(méi)有作用。
System.out.println(""" Hello, multiline text blocks! """); // 結(jié)果 // > Hello, // > multiline // > text blocks!
Consul是什么?如何基于Consul創(chuàng)建分布鎖
2023-07-11Java培訓(xùn):布隆過(guò)濾器與布谷鳥(niǎo)過(guò)濾器的區(qū)別及應(yīng)用場(chǎng)景
2023-07-11Java內(nèi)部培訓(xùn):有哪些避免空指針的方法?
2023-07-10業(yè)務(wù)開(kāi)發(fā)時(shí),接口不能對(duì)外暴露怎么辦?
2023-07-10Java培訓(xùn):什么叫內(nèi)存溢出和內(nèi)存泄漏?
2023-07-07一鍵免費(fèi)學(xué)!黑馬程序員全新編程實(shí)戰(zhàn)項(xiàng)目《蒼穹外賣》發(fā)布!
2023-07-06