在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    詳解 Java 17 中的模式匹配(Pattern Matching)

    提到模式匹配(Pattern Matching),Java 開發(fā)人員可能會比較陌生。實際上,其他編程語言的開發(fā)人員早就已經(jīng)使用過模式匹配了。JVM 上的編程語言 Scala 的模式匹配功能就很強(qiáng)大。

    什么是模式匹配?

    為了更好地解釋模式匹配,我們從一個簡單的例子開始。我們希望創(chuàng)建一個方法,可以把任何對象轉(zhuǎn)換成 String 格式。這就需要根據(jù)對象的類型來進(jìn)行不同的格式化操作。我們可以很容易就寫出下面這樣的代碼。這段代碼的核心是使用 instanceof 操作符來檢查輸入對象的類型,再根據(jù)對象類型進(jìn)行格式化操作。

    public class ObjectFormatter {public String format(Object input) {if (input == null) {return “”;} else if (input instanceof Number) {return NumberFormat.getNumberInstance().format(input);} else if (input instanceof LocalDateTime) {return ((LocalDateTime) input).format(DateTimeFormatter.ISO_DATE_TIME);} else {return input.toString();}}}

    上述對 instanceof 操作符的使用就是模式匹配的一種簡單形式。

    一個模式由匹配 predicate 和模式變量的集合組成。

    • 匹配 predicate 判斷一個模式是否可以匹配目標(biāo)對象。
    • 如果模式匹配的話,模式變量的集合用來從目標(biāo)對象中提取值。

    在 instanceof 操作符的例子中,匹配 predicate 的作用是檢查目標(biāo)對象的類型,而模式變量的集合中只有一個變量,就是目標(biāo)對象自身。這種類型的模式,被稱為類型模式(type pattern)。除了類型模式之外,計劃中的模式還包括記錄類型模式和數(shù)組模式。

    模式匹配是一個涵蓋范圍非常大的功能。根據(jù)現(xiàn)在 Java 的發(fā)布周期,模式匹配的內(nèi)容會在不同的 Java 版本中逐漸添加進(jìn)來。具體的發(fā)布周期可以參考下面的表格。這個表格的右側(cè)三列表示的是不同的與模式匹配相關(guān)的功能,每一行表示這些功能在對應(yīng) Java 版本中的可用狀態(tài)。

    Java版本

    instanceof 模式

    switch 的模式匹配

    記錄類型模式

    Java 14

    預(yù)覽

    Java 15

    二次預(yù)覽

    Java 16

    正式功能

    Java 17

    正式功能

    預(yù)覽

    Java 18

    正式功能

    二次預(yù)覽

    Java 19

    正式功能

    三次預(yù)覽

    預(yù)覽

    以 Java 17 為例,可以使用 instance 模式的正式功能,以及 switch 模式匹配的預(yù)覽功能。

    Java 18 和 Java 19 中可用的模式匹配功能也列在了表格中,作為參考。

    instanceof 模式匹配

    Java 中的 instanceof 操作符用來檢查對象的類型。下面的代碼給出了通常使用 instanceof 操作符的代碼范式。在 if 語句中使用 instanceof 來進(jìn)行檢查,如果檢查通過,則使用強(qiáng)制類型轉(zhuǎn)換,把輸入對象 obj 轉(zhuǎn)換成 String 類型的 s,最后再使用變量 s。

    if (obj instanceof String) {String s = (String) obj;}

    從上述代碼中可以看到,對 instanceof 操作符的使用范式是非常繁瑣的,其中需要檢查的目標(biāo)類型 String 就出現(xiàn)了三次。在使用了 instanceof 模式匹配之后,代碼可以簡化很多。在下面的代碼中, String s 表示類型模式,其中 String 是需要匹配的類型,s 是匹配成功之后用來捕獲目標(biāo)對象的變量。該變量 s 可以直接在 if 語句塊中使用。

    if (obj instanceof String s) {System.out.println(s.toUpperCase());}

    模式變量使用的是流作用域(flow scoping)。一個模式變量能夠出現(xiàn)在作用域中,當(dāng)且僅當(dāng)編譯器可以推斷出模式匹配必定成功,并且該變量被賦予了一個值時。在上面的例子中,if 語句塊的代碼只有在模式匹配成功了之后才會執(zhí)行,變量 s 此時必定被賦予了值 obj,因此編譯器可以確定 s 必定在 if 語句塊的作用域中。

    關(guān)于流作用域,其實不用了解太多。如果使用錯誤,編譯器會提示你的。

    下面的代碼給出了 instanceof 模式匹配的代碼示例。第一個 if 匹配 String 類型的同時,加上了對字符串長度的檢查;第二個 if 匹配剩下的 String 類型的對象。在第一個 if 的條件中,obj instanceof String s 和 s.length() > 10 的順序不能反過來。這里利用了 && 的短路(short-circuit)特性,當(dāng)?shù)谝粋€ instanceof 模式匹配成功之后,才會執(zhí)行后面的判斷,這個時候 s 必然是一個 String 對象,可以安全地使用 length 方法;如果第一個 instanceof 模式不匹配,后面的判斷不會被執(zhí)行,因此也不會出現(xiàn)錯誤。

    public class StringMatch {public void test(Object obj) {if (obj instanceof String s && s.length() > 10) {System.out.println(“長字符串 -> ” + s);} else if (obj instanceof String s) {System.out.println(“短字符串 -> ” + s);} else {System.out.println(“其他”);}}}

    在 switch 語句和表達(dá)式中使用模式匹配

    在 Java 17 中,switch 語句和表達(dá)式的 case 子句中可以使用模式匹配。該功能在 Java 17 中是預(yù)覽功能,因此需要通過命令行參數(shù) –enable-preview 來啟用。switch 在很多時候可以替代嵌套的 if/else。

    下面的代碼使用 switch 語句加上模式匹配改寫了上面的使用嵌套 if/else 的代碼示例。使用 switch 比 if/else 更加簡潔。這里的 switch 用的是箭頭格式。

    public class StringMatch {public void test(Object obj) {switch (obj) {case String s && s.length() > 10 -> System.out.println(“長字符串 -> ” + s);case String s -> System.out.println(“短字符串 -> ” + s);default -> System.out.println(“其他”);}}}

    我們可以用 switch 語句改寫文章開頭提到的對象格式化的方法,如下面的代碼所示。使用 switch 語句加上模式匹配的代碼更加簡潔易懂。

    public class ObjectFormatter {public String format(Object input) {return switch (input) {case null -> “”;case Number n -> NumberFormat.getNumberInstance().format(n);case LocalDateTime t -> t.format(DateTimeFormatter.ISO_DATE_TIME);default -> input.toString();};}}

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年9月4日 15:05
    下一篇 2022年9月4日 15:05

    相關(guān)推薦

    • 存儲過程語法(sql server存儲過程語法)

      今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

      2022年11月26日
    • 英雄聯(lián)盟手游好玩嗎(英雄聯(lián)盟手游好玩還是端游好玩)

      簡要回答 非常好玩,英雄聯(lián)盟手游這款游戲已經(jīng)正式的進(jìn)行公測,這款游戲是以5v5為模式進(jìn)行對戰(zhàn)的,它是以英雄聯(lián)盟端游為原型進(jìn)行開發(fā),里面的每一種玩法基本都沿襲了端游的特點。 01 這…

      2022年11月25日
    • 抖音怎么帶貨賺傭金(抖音怎么視頻帶鏈接)

      現(xiàn)在直播帶貨很火,而如今無論是自媒體還是短視頻,大家都可以通過帶貨來賺錢,只要你有貨源渠道,就可以通過帶貨來賺取傭金。如果你想要做帶貨傭金的話,你可以了解相關(guān)技能,例如,你必須與企…

      2022年11月22日
    • 劉慈欣親自解讀“黑暗森林”;《云頂之弈》全球總決賽XunGe奪冠丨每日B報

      星彡P(guān)丨文 每日一圖 早期帕底亞學(xué)生捕捉海地鼠的珍貴視頻,請自行搭配BGM《只因你太美》。 劉慈欣解讀“黑暗森林” 《三體》動畫將于12月3日開播,官方發(fā)布了一段預(yù)熱視頻,并邀請到…

      2022年11月22日
    • 我的世界指令創(chuàng)造(我的世界指令創(chuàng)造生存)

      只有允許作弊的地圖才可以用指令將世界切換到創(chuàng)造模式具體步驟如下1首先在地圖的選項界面,將地圖允許作弊按鈕打開2進(jìn)入該可以作弊的地圖后 ,按下鍵盤上的~鍵,在彈出的對話框中,輸入ga…

      2022年11月20日
    • 京東店鋪類型有哪些京東入駐有什么資質(zhì)要求

      今天的互聯(lián)網(wǎng)發(fā)展迅速,讓傳統(tǒng)企業(yè)有了更多選擇,但也同樣也對剛觸網(wǎng)的商家增添了許多迷茫,近日知舟電商就收到很多商家朋友詢問京東入駐相關(guān)問題,今天知舟君就給大家分享下。 一.京東入駐準(zhǔn)…

      2022年11月18日
    • 分享5個無本創(chuàng)業(yè)的項目(無本創(chuàng)業(yè)的項目有哪些)

      現(xiàn)在越來越多的上班族不愿意繼續(xù)了,因為毫無自由,發(fā)展堪憂,上班永遠(yuǎn)是個打工仔,干的再牛B,積累的也是打工經(jīng)驗,而不是老板經(jīng)驗,思維永遠(yuǎn)停留在打工者模式是很可怕的,待在羊群里,永遠(yuǎn)無…

      2022年11月18日
    • 王者榮耀《代號破曉》怎么玩?《代號破曉》游戲玩法模式介紹

      代號破曉的游戲曝光之后,就吸引了不少玩家,這個游戲的設(shè)定是比較有趣的,建立一個暗心世界后,需要進(jìn)行戰(zhàn)斗來獲取勝利,游戲的玩法也是比較有趣的,那么游戲的具體玩法是什么呢?接下來小編就…

      2022年11月17日
    • 怎么刪除自己的追評(淘寶追評可以刪除嗎)

      一、淘寶店鋪每個評價類型的處理方案都是不同的,那具體哪些評價類型該如何區(qū)分呢? 1、主評為好評時:不支持修改或者刪除評價的,若中評/差評改為好評,也不可修改或刪除 ; 2、當(dāng)主評為…

      2022年11月17日
    • 抖店開了半個月了沒有銷量(個人怎么開抖音小店)

      抖音小店現(xiàn)在已經(jīng)是火的不行了,人盡皆知,給大家說個搞笑的事。 之前回家的時候,提起來創(chuàng)業(yè)這件事,我媽就給我說最近看了一個創(chuàng)業(yè)的,自己就能做,還不錯,然后就開始給我介紹這個項目是啥啥…

      2022年11月14日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息