最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java21之字符串模板的使用小結

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

字符串模板是很多語言都具備的特性,它允許在字符串中使用占位符來動態(tài)替換變量的值,這種構建字符串的方式比傳統(tǒng)的字符串拼接或格式化更為簡潔和直觀。相信學過 JavaScript 的同學對下面這個 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);

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

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

這是因為字符串模板還只是一個預覽特性,根據(jù) JEP 12: Preview Features,我們需要添加 --enable-preview 參數(shù)開啟預覽特性,使用 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ù)學運算:

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)嵌表達式中可以直接使用雙引號,不用 \" 轉義:

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
               }
               """;

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

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

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

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

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

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

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

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

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

FMT模板處理器

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

%7.2f\{price}

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

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

小結

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

  • 簡潔性:相比傳統(tǒng)的字符串拼接或 String.format() 等方法,模板表達式的寫法更加簡潔易讀,特別是在處理復雜的多行字符串時,結合文本塊特性,代碼的可讀性得到了顯著提升;
  • 靈活的模板處理器: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ā)體驗。

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

相關文章

  • MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權限控制的方法

    MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權限控制的方法

    MyBatis-Plus是一款基于MyBatis的增強工具,它提供了一些便捷的功能和增強的查詢能力,數(shù)據(jù)權限控制是在系統(tǒng)中對用戶訪問數(shù)據(jù)進行限制的一種機制,這篇文章主要給大家介紹了關于MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權限控制的相關資料,需要的朋友可以參考下
    2024-01-01
  • Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)

    Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)

    這篇文章主要介紹了Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)的相關資料,需要的朋友可以參考下
    2017-05-05
  • springboot集成flowable實踐

    springboot集成flowable實踐

    本文介紹了Flowable業(yè)務流程管理引擎在Spring Boot 2.3版本中的集成,Flowable支持BPMN2.0標準,提供了流程定義、實例管理和數(shù)據(jù)訪問等功能,文章詳細介紹了Flowable生成的數(shù)據(jù)庫表及其用途,并通過一個請假審批流程的示例,展示了如何部署和測試Flowable
    2026-01-01
  • 用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟

    用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟

    這篇文章主要介紹了用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java中將一個列表拆分為多個較小列表的三種不同方法

    Java中將一個列表拆分為多個較小列表的三種不同方法

    有時候我們需要將大集合按指定的數(shù)量分割成若干個小集合,這篇文章主要給大家介紹了關于Java中將一個列表拆分為多個較小列表的三種不同方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • java File類重要方法以及如何操作文件詳解

    java File類重要方法以及如何操作文件詳解

    這篇文章主要為大家介紹了java File類重要方法以及如何操作文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java中類加載器舉例詳解

    Java中類加載器舉例詳解

    Java類加載器是Java語言的核心組件之一,負責從文件系統(tǒng)或網(wǎng)絡中加載Class文件,Class文件在文件開頭有特定的文件標識,這篇文章主要介紹了Java中類加載器的相關資料,需要的朋友可以參考下
    2026-01-01
  • Java基于LoadingCache實現(xiàn)本地緩存的示例代碼

    Java基于LoadingCache實現(xiàn)本地緩存的示例代碼

    本文主要介紹了Java基于LoadingCache實現(xiàn)本地緩存的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Redisson分布式鎖實現(xiàn)原理示例詳解

    Redisson分布式鎖實現(xiàn)原理示例詳解

    Redisson分布式鎖通過Lua腳本保證原子性操作,實現(xiàn)了分布式互斥、可重入、自動續(xù)期等核心特性,其高級特性包括公平鎖、讀寫鎖和紅鎖算法,能夠滿足不同場景下的并發(fā)控制需求,這篇文章主要介紹了Redisson分布式鎖實現(xiàn)原理的相關資料,需要的朋友可以參考下
    2026-04-04
  • Spring boot動態(tài)修改日志級別的方法

    Spring boot動態(tài)修改日志級別的方法

    我們經(jīng)常會遇到業(yè)務想看debug日志的問題,但是debug日志頻繁打印會對日志查看有影響,且日志多對系統(tǒng)也會有一定的壓力,因此,如果可以在需要的時候動態(tài)臨時調(diào)整下日志的級別則是比較完美的,spring boot已經(jīng)支持這種功能,需要的朋友可以參考下
    2022-12-12

最新評論

新干县| 长春市| 克什克腾旗| 永福县| 浙江省| 上杭县| 新田县| 蒙城县| 平遥县| 揭西县| 临高县| 厦门市| 丽江市| 屏南县| 五寨县| 台前县| 松阳县| 固原市| 桂东县| 曲松县| 营口市| 涡阳县| 浦北县| 汾阳市| 大宁县| 阿拉善右旗| 云梦县| 澄迈县| 满洲里市| 张家界市| 河北区| 元朗区| 汽车| 秭归县| 武宣县| 盐边县| 吉木乃县| 绥化市| 远安县| 尉犁县| 平武县|