前瞻|Java 21 新特性 String Templates(字元串模版)

来源:https://www.cnblogs.com/didispace/archive/2023/09/04/17677084.html
-Advertisement-
Play Games

在日常寫Java的時候,對於字元串的操作是非常普遍的,其中最常見的就是對字元串的組織。也因為這個操作非常普遍,所以誕生了很多方案,總下來大概有這麼幾種: - 使用`+`拼接 - 使用`StringBuffer`和`SpringBuilder` - `String::format` and `Stri ...


在日常寫Java的時候,對於字元串的操作是非常普遍的,其中最常見的就是對字元串的組織。也因為這個操作非常普遍,所以誕生了很多方案,總下來大概有這麼幾種:

  • 使用+拼接
  • 使用StringBufferSpringBuilder
  • String::format and String::formatted
  • 使用java.text.MessageFormat

下麵,我們一起來學習一下Java 21中的新方案!如果您對於上面這些還不熟悉的話,建議可以先看一下這篇《Java自帶的4種字元串組織和格式化方法》,瞭解以前的機制,這樣與最新的處理方案做對比,理解會更深刻。

模版表達式

在Java 21中處理字元串的新方法稱為:Template Expressions,即:模版表達式。

模版表達式是Java語言中的一種新表達式。它可以執行字元串插值,幫助開發人員通過編程的方式安全高效地組織字元串。此外,模板表達式不僅僅可以用於組織字元串,它還可以根據特定模型的規則將結構化文本轉換為任何類型的對象。

下麵通過一個簡單的案例來認識一下它:

String blog = "blog.didispace.com";
String str = STR."My blog is \{blog}";

上述代碼中的第2行就是一個模版表達式,其中主要包含三個部分:

  • 模版處理器:STR
  • 包含內嵌表達式(\{blog})的模版
  • 通過.把前面兩部分組合起來,形式上類似方法調用

當模版表達式運行的時候,模版處理器會將模版內容與內嵌表達式的值組合起來,生成結果,所以上面案例中的字元串str在運行時的結果為:My blog is blog.didispace.com

多行模版表達式

還記得之前我們的Java新特性專欄中,介紹過Java 15中的文本塊特性嗎?類似下麵這樣的寫法:

String html = """
    <html>
    <body>
      <h1>Java 15 新特性:文本塊 | 程式猿DD</h1>
      <p>didispace.com</p>
    </body>
    </html>
    """;

模版表達式也支持類似的多行字元串處理,所以開發者可以用它來方便的組織html、json、xml等字元串內容,比如下麵這樣:

var json = STR."""
{
    "user": "\{name}",
    "age: \{age}
}
""";

STR模版處理器

上面案例中我們所用的STR模版處理器中的內嵌表達式都採用了字元串內容,而實際上STR模版處理器還有更多的用途。

  1. 內嵌表達式中還可以之前數學運算,比如:
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

最終s字元串結果為:10 + 20 = 30

  1. 內嵌表達式中還可以調用方法,比如:
String s = STR."My blog is \{getMyBlog()}"; 

假設getMyBlog方法返回的內容為blog.didispace.com,那麼最終s字元串結果為:My blog is blog.didispace.com

  1. 內嵌表達式中還可以訪問對象的成員變數,比如:
User u = new User("didi", "blog.didispace.com"); // 構造函數參數為name屬性和blog屬性
String s = STR."\{u.name}的博客地地址為:+ \{u.blog}";

最終s字元串結果為:didi的博客地址為:blog.didispace.com

FMT模版處理器

除了STR模版處理器之外,Java中還提供了另外一個模版處理器:FMT。FMT模版處理器除了與STR模版處理器一樣提供插值能力之外,還提供了左側的格式化處理。下麵通過例子來直接理解FMT的功能:

record Rectangle(String name, double width, double height) {
    double area() {
        return width * height;
    }
}
Rectangle[] zone = new Rectangle[] {
    new Rectangle("Alfa", 17.8, 31.4),
    new Rectangle("Bravo", 9.6, 12.4),
    new Rectangle("Charlie", 7.1, 11.23),
};
String table = STR."""
    Description  Width  Height  Area
    \{zone[0].name}  \{zone[0].width}  \{zone[0].height}     \{zone[0].area()}
    \{zone[1].name}  \{zone[1].width}  \{zone[1].height}     \{zone[1].area()}
    \{zone[2].name}  \{zone[2].width}  \{zone[2].height}     \{zone[2].area()}
    Total \{zone[0].area() + zone[1].area() + zone[2].area()}
    """;

上面這塊是由STR模版處理器組織字元串表格數據,從模版表達式來看是非常整齊的,但是由於模版中內嵌表達式的值長短不一,最終輸出結果很有可能差強人意,比如STR模版處理器處理後的結果是這樣的:

Description  Width  Height  Area
Alfa  17.8  31.4     558.92
Bravo  9.6  12.4     119.03999999999999
Charlie  7.1  11.23     79.733
Total 757.693

為瞭解決這個問題,就可以採用FMT模版處理器,在每一列左側定義格式

String table = FMT."""
    Description     Width    Height     Area
    %-12s\{zone[0].name}  %7.2f\{zone[0].width}  %7.2f\{zone[0].height}     %7.2f\{zone[0].area()}
    %-12s\{zone[1].name}  %7.2f\{zone[1].width}  %7.2f\{zone[1].height}     %7.2f\{zone[1].area()}
    %-12s\{zone[2].name}  %7.2f\{zone[2].width}  %7.2f\{zone[2].height}     %7.2f\{zone[2].area()}
    \{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
    """;

這樣的結果將是如下這樣,獲得一個整齊的結果:

Description     Width    Height     Area
Alfa            17.80    31.40      558.92
Bravo            9.60    12.40      119.04
Charlie          7.10    11.23       79.73
                             Total  757.69

關於Java 21中推出的String Templates特性還有很多高級能力,比如:自定義模版處理器等。因為該特性還處於Preview階段,所以DD也還沒有深入研究,僅嘗鮮了一下基本功能,如果您對其他高級能力感興趣,也可以通過官網學習。等該功能正式發佈之後,我會在 Java新特性專欄 中更新解讀所有內容,歡迎關註與收藏。

歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 1、條件變數 當線程需要等待特定事件發生、或是某個條件成立時,可以使用條件變數`std::condition_variable`,它在標準庫頭文件``內聲明。 ```c++ std::mutex mut; std::queue data_queue; std::condition_variab ...
  • # 學習Markdown Typora初體驗 ## 標題 語法:`#+空格+標題+回車`。幾級標題就有幾個#號。 ### 三級標題 #### 四級標題 ##### 五級標題 ###### 六級標題 ####### 七級標題。。。我沒有 ## 字體 *斜體* 語法: $$ *內容* $$ **加粗** ...
  • # 第一章HTML #### 1.1 html的定義 html是超文本標記語言,是一個基於HTTP(超文本傳輸協議)協議的網頁語言 #### 1.2 html的版本 HTML 4.01 以及具備完善的網頁編輯 HTML 5.0 移動端網頁編輯 XHTML 語法嚴格 #### 1.3 瀏覽器 保障相容 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《LeetCode952三部曲之三 ...
  • # Python文件的基本操作 - 文件的基本操作 - 文件的讀寫模式 - 文件的讀寫操作相關的方法 - 文件的操作模式 - 文件的練習題 ## 文件的基本操作 ```python 1. 我們能夠操作哪些類型的文件: .txt 沒有尾碼名的文件 # 我們現在不能操作word、Excel、PPT等文件 ...
  • ## 單點登錄服務端搭建 1、下載cas包 `https://github.com/apereo/cas-overlay-template/tree/5.3` 這好像是最後一個maven版本的,之後都是grade版本的 2、使用idea打開代碼,導入依賴 3、新建src目錄、resource目錄 4 ...
  • 部署 操作系統:CentOS:7.4,perl版本:v5.16.3,opensearch版本:3.0.8 1.下載地址:https://www.openssl.org/source/ 2.安裝cmd.pm模塊,不然編譯的時候會引發【Can‘t locate IPC/Cmd.pm in @INC】錯誤 ...
  • PE結構是`Windows`系統下最常用的可執行文件格式,理解PE文件格式不僅可以理解操作系統的載入流程,還可以更好的理解操作系統對進程和記憶體相關的管理知識,DOS頭是PE文件開頭的一個固定長度的結構體,這個結構體的大小為64位元組(0x40)。DOS頭包含了很多有用的信息,該信息可以讓Windows... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...