Java21之字符串模板的使用小結(jié)
字符串模板是很多語言都具備的特性,它允許在字符串中使用占位符來動態(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模板處理器,也可以是RAW或FMT等,甚至可以自定義; - 中間是一個點號(
.); - 最后跟著一個字符串模板,模板中使用
\{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)置了
STR和FMT兩個模板處理器,滿足不同的需求,同時開發(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)文章希望大家以后多多支持腳本之家!
- 2021最新Java?JDK1.8的安裝超詳細教程
- IDEA報錯:java:無效的源發(fā)行版21解決方式
- 你應(yīng)該知道的21個Java核心技術(shù)
- 2022年最新java?8?(?jdk1.8u321)安裝圖文教程
- idea創(chuàng)建spring?boot項目時javaversion只能選擇17和21解決辦法
- IDEA中JDK是1.8但Java版本只有21和17的解決辦法
- 利用Java快速查找21位花朵數(shù)示例代碼
- 解決idea創(chuàng)建版本時只有Java21和Java17選項
- IntelliJ IDEA 2021.1 EAP 1 發(fā)布支持 Java 16 和 WSL 2
相關(guān)文章
springboot controller 增加指定前綴的兩種實現(xiàn)方法
這篇文章主要介紹了springboot controller 增加指定前綴的兩種實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Springbootadmin與security沖突問題及解決
這篇文章主要介紹了Springbootadmin與security沖突問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題
這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題,文中有詳細的解決步驟,如果有遇到一樣問題的小伙伴,可以參考閱讀本文2023-09-09

