欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java21之字符串模板的使用小結(jié)

 更新時間:2025年10月30日 10:12:22   作者:日習(xí)一技             VIP.1 初學(xué)乍練  
本文主要介紹了Java21之字符串模板的使用小結(jié),通過模板表達式和內(nèi)嵌表達式的設(shè)計,使得字符串的構(gòu)造更加簡潔、直觀和類型安全,核心優(yōu)勢包括簡潔性、靈活的模板處理器、與文本塊的完美配合等

字符串模板是很多語言都具備的特性,它允許在字符串中使用占位符來動態(tài)替換變量的值,這種構(gòu)建字符串的方式比傳統(tǒng)的字符串拼接或格式化更為簡潔和直觀。相信學(xué)過 JavaScript 的同學(xué)對下面這個 Template literals 的語法不陌生:

const name = 'zhangsan'
const age = 18
const message = `My name is ${name}, I'm ${age} years old.`
console.log(message)

如上所示,JavaScript 通過反引號 ` 來定義字符串模板,而 Java 21 則引入了一個叫做 模版表達式(Template expressions) 的概念來定義字符串模板。下面是一個簡單示例:

String name = "zhangsan";
int age = 18;
String message = STR."My name is \{name}, I'm \{age} years old.";
System.out.println(message);

看上去和 JavaScript 的 Template literals 非常相似,但還是有一些區(qū)別的,模版表達式包含三個部分:

  • 首先是一個 模版處理器(template processor):這里使用的是 STR 模板處理器,也可以是 RAWFMT 等,甚至可以自定義;
  • 中間是一個點號(.);
  • 最后跟著一個字符串模板,模板中使用 \{name}\{age} 這樣的占位符語法,這被稱為 內(nèi)嵌表達式(embedded expression);

當(dāng)模版表達式運行的時候,模版處理器會將模版內(nèi)容與內(nèi)嵌表達式的值組合起來,生成結(jié)果。

不過,當(dāng)我們執(zhí)行上述代碼時,很可能會報 Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ ) 這樣的錯:

這是因為字符串模板還只是一個預(yù)覽特性,根據(jù) JEP 12: Preview Features,我們需要添加 --enable-preview 參數(shù)開啟預(yù)覽特性,使用 javac 編譯時,還需要添加 --release 參數(shù)。使用下面的命令將 .java 文件編譯成 .class 文件:

$ javac --enable-preview --release 21 StringTemplates.java 
Note: StringTemplates.java uses preview features of Java SE 21.
Note: Recompile with -Xlint:preview for details.

再使用下面的命令運行 .class 文件:

$ java --enable-preview StringTemplates
My name is zhangsan, I'm 18 years old.

從 Java 11 開始,我們可以直接運行 .java 文件了,參見 JEP 330,所以上面的兩個命令也可以省略成一個命令:

$ java --enable-preview --source 21 StringTemplates.java

STR模版處理器

STR 模板處理器中的內(nèi)嵌表達式還有很多其他寫法,比如執(zhí)行數(shù)學(xué)運算:

int x = 1, y = 2;
String s1 = STR."\{x} + \{y} = \{x + y}";

調(diào)用方法:

String s2 = STR."Java version is \{getVersion()}";

訪問字段:

Person p = new Person(name, age);
String s3 = STR."My name is \{p.name}, I'm \{p.age} years old.";

內(nèi)嵌表達式中可以直接使用雙引號,不用 \" 轉(zhuǎn)義:

String s4 = STR."I'm \{age >= 18 ? "an adult" : "a child"}.";

內(nèi)嵌表達式中可以編寫注釋和換行:

String s5 = STR."I'm \{
    // check the age
    age >= 18 ? "an adult" : "a child"
}.";

多行模板表達式

在 Java 13 的 JEP 355 中首次引入了 文本塊(Text Blocks) 特性,并經(jīng)過 Java 14 的 JEP 368 和 Java 15 的 JEP 378 兩個版本的迭代,使得該特性正式可用,這個特性可以讓我們在 Java 代碼中愉快地使用多行字符串。在使用文本塊之前,定義一個 JSON 格式的字符串可能會寫出像下面這樣無法直視的代碼來:

String json1 = "{\n" +
               "  \"name\": \"zhangsan\",\n" +
               "  \"age\": 18\n" +
               "}\n";

但是在使用文本塊之后,這樣的代碼就變得非常清爽:

String json2 = """
               {
                 "name": "zhangsan",
                 "age": 18
               }
               """;

文本塊以三個雙引號 """ 開始,同樣以三個雙引號結(jié)束,看上去和 Python 的多行字符串類似,不過 Java 的文本塊會自動處理換行和縮進,使用起來更方便。上面的文本塊在 Java 中輸出如下:

{
  "name": "zhangsan",
  "age": 18
}

注意開頭沒有換行,結(jié)尾有一個換行。而在 Python 中輸出如下:

               {
                 "name": "zhangsan",
                 "age": 18
               }

不僅開頭和結(jié)尾都有換行,而且每一行有很多縮進,這里可以看出 Python 的處理很簡單,它直接把 """ 之間的內(nèi)容原樣輸出了,而 Java 是根據(jù)最后一個 """ 和內(nèi)容之間的相對縮進來決定輸出。很顯然,我們更喜歡 Java 這樣的輸出結(jié)果,如果希望 Python 有同樣的輸出結(jié)果,就得這樣寫:

json = """{
  "name": "zhangsan",
  "age": 18
}
"""

這在代碼的可讀性上就比不上 Java 了,這里不得不感嘆 Java 的設(shè)計,在細節(jié)的處理上做的確實不錯。

言歸正傳,說回字符串模板這個特性,我們也可以在文本塊中使用,如下:

String json3 = STR."""
               {
                 "name": "\{name}",
                 "age": \{age}
               }
               """;

FMT模板處理器

FMT 是 Java 21 內(nèi)置的另一個模版處理器,它不僅有 STR 模版處理器的插值功能,還可以對輸出進行格式化操作。格式說明符(format specifiers) 放在嵌入表達式的左側(cè),如下所示:

%7.2f\{price}

支持的格式說明符參見 java.util.Formatter 文檔。

不過在我的環(huán)境里編譯時,會報錯 cannot find symbol: variable FMT,就算是把鏡像更換成 openjdk:22-jdk 也是一樣的錯,不清楚是為什么。

小結(jié)

我們今天學(xué)習(xí)了 Java 21 引入的 字符串模板(String Templates) 特性,它通過 模板表達式內(nèi)嵌表達式 的設(shè)計,使得字符串的構(gòu)造更加簡潔、直觀和類型安全。字符串模板的核心優(yōu)勢在于:

  • 簡潔性:相比傳統(tǒng)的字符串拼接或 String.format() 等方法,模板表達式的寫法更加簡潔易讀,特別是在處理復(fù)雜的多行字符串時,結(jié)合文本塊特性,代碼的可讀性得到了顯著提升;
  • 靈活的模板處理器:Java 21 內(nèi)置了 STRFMT 兩個模板處理器,滿足不同的需求,同時開發(fā)者也可以實現(xiàn)自定義的模板處理器來擴展功能;
  • 與文本塊的完美配合:字符串模板與文本塊特性搭配使用,在處理 JSON、XML、HTML 等多行格式化文本時,表現(xiàn)出了顯著的優(yōu)勢,使代碼變得更加優(yōu)雅;

總的來說,字符串模板是 Java 語言在現(xiàn)代化演進中的又一個重要步伐,通過借鑒其他編程語言(如 JavaScript、Python、Kotlin 等)的成功經(jīng)驗,為 Java 開發(fā)者提供了更加便利和舒適的開發(fā)體驗。

到此這篇關(guān)于Java21之字符串模板的使用小結(jié)的文章就介紹到這了,更多相關(guān)Java21 字符串模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論