宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動(dòng)態(tài)
精選推薦

Java 新特性:String Templates(字符串模版)

管理 管理 編輯 刪除

在日常寫Java的時(shí)候,對(duì)于字符串的操作是非常普遍的,其中最常見的就是對(duì)字符串的組織。也因?yàn)檫@個(gè)操作非常普遍,所以誕生了很多方案,總下來大概有這么幾種:

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

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

模版表達(dá)式

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

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

下面通過一個(gè)簡單的案例來認(rèn)識(shí)一下它:

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

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

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

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

多行模版表達(dá)式

類似下面這樣的寫法:

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

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

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

STR模版處理器

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

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

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

2.內(nèi)嵌表達(dá)式中還可以調(diào)用方法,比如:

String s = STR."My blog is \{getMyBlog()}"; 

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

3.內(nèi)嵌表達(dá)式中還可以訪問對(duì)象的成員變量,比如:

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中還提供了另外一個(gè)模版處理器: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ù),從模版表達(dá)式來看是非常整齊的,但是由于模版中內(nèi)嵌表達(dá)式的值長短不一,最終輸出結(jié)果很有可能差強(qiáng)人意,比如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

為了解決這個(gè)問題,就可以采用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é)果將是如下這樣,獲得一個(gè)整齊的結(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


請(qǐng)登錄后查看

CRMEB 最后編輯于2024-12-16 16:40:28

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1166
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁頭條 首頁動(dòng)態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服