激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 前瞻|Java 21 新特性 String Templates(字符串模版)

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

2023-09-23 03:01未知服務器之家 Java教程

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

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

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

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

模版表達式

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

模版表達式是Java語言中的一種新表達式。它可以執(zhí)行字符串插值,幫助開發(fā)人員通過編程的方式安全高效地組織字符串。此外,模板表達式不僅僅可以用于組織字符串,它還可以根據(jù)特定模型的規(guī)則將結(jié)構(gòu)化文本轉(zhuǎn)換為任何類型的對象。

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

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

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

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

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

多行模版表達式

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

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

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

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

STR模版處理器

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

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

最終s字符串結(jié)果為:10 + 20 = 30

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

假設getMyBlog方法返回的內(nèi)容為blog.didispace.com,那么最終s字符串結(jié)果為:My blog is blog.didispace.com

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

最終s字符串結(jié)果為:didi的博客地址為:blog.didispace.com

FMT模版處理器

除了STR模版處理器之外,Java中還提供了另外一個模版處理器:FMT。FMT模版處理器除了與STR模版處理器一樣提供插值能力之外,還提供了左側(cè)的格式化處理。下面通過例子來直接理解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模版處理器組織字符串表格數(shù)據(jù),從模版表達式來看是非常整齊的,但是由于模版中內(nèi)嵌表達式的值長短不一,最終輸出結(jié)果很有可能差強人意,比如STR模版處理器處理后的結(jié)果是這樣的:

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模版處理器,在每一列左側(cè)定義格式

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

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

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也還沒有深入研究,僅嘗鮮了一下基本功能,如果您對其他高級能力感興趣,也可以通過官網(wǎng)學習。等該功能正式發(fā)布之后,我會在 Java新特性專欄 中更新解讀所有內(nèi)容,歡迎關注與收藏。

歡迎關注我的公眾號:程序猿DD。第一時間了解前沿行業(yè)消息、分享深度技術干貨、獲取優(yōu)質(zhì)學習資源

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人在线免费观看网址 | 一级做a爱片性色毛片高清 国产精品色在线网站 | 国产亚洲精彩视频 | 国产精品av久久久久久网址 | 精品国产一区在线 | 妇子乱av一区二区三区 | 欧美一级一区二区三区 | 羞羞视频免费网站入口 | 日本免费不卡一区二区 | 欧美aaaaa一级毛片在线 | 精品久久久久久久久久 | 狠狠操人人干 | 91短视频版高清在线观看免费 | 欧美韩国日本在线 | 欧美日韩国产综合网 | 精品亚洲在线 | 国产精品视频导航 | 日韩中文字幕一区二区三区 | 综合精品视频 | 成人羞羞网站入口 | 精品一区二区久久久久久久网精 | 亚洲第一黄色网 | 91精品国产一区二区在线观看 | 日韩av片在线免费观看 | 久久国产精品久久久久久久久久 | 成年人毛片视频 | 最新福利在线 | 水多视频在线观看 | 日本在线视频免费 | 欧美伦理一区二区 | 色中色在线播放 | gogo全球大胆高清人露出91 | 主播粉嫩国产在线精品 | 国产女做a爱免费视频 | 羞羞视频免费观看入口 | 深夜影院a | 成人在线视频播放 | 国产亚洲精品久久午夜玫瑰园 | 中国精品久久 | 久久国产精品99久久人人澡 | 成人一级视频在线观看 |