亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

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

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

                什么是模式匹配?

                為了更好地解釋模式匹配,我們從一個(gè)簡單的例子開始。我們希望創(chuàng)建一個(gè)方法,可以把任何對象轉(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 操作符的使用就是模式匹配的一種簡單形式。

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

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

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

                模式匹配是一個(gè)涵蓋范圍非常大的功能。根據(jù)現(xiàn)在 Java 的發(fā)布周期,模式匹配的內(nèi)容會在不同的 Java 版本中逐漸添加進(jìn)來。具體的發(fā)布周期可以參考下面的表格。這個(gè)表格的右側(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)。一個(gè)模式變量能夠出現(xiàn)在作用域中,當(dāng)且僅當(dāng)編譯器可以推斷出模式匹配必定成功,并且該變量被賦予了一個(gè)值時(shí)。在上面的例子中,if 語句塊的代碼只有在模式匹配成功了之后才會執(zhí)行,變量 s 此時(shí)必定被賦予了值 obj,因此編譯器可以確定 s 必定在 if 語句塊的作用域中。

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

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

                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 在很多時(shí)候可以替代嵌套的 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ā),里面的每一種玩法基本都沿襲了端游的特點(diǎn)。 01 這…

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

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

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

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

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

                  只有允許作弊的地圖才可以用指令將世界切換到創(chuàng)造模式具體步驟如下1首先在地圖的選項(xiàng)界面,將地圖允許作弊按鈕打開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個(gè)無本創(chuàng)業(yè)的項(xiàng)目(無本創(chuàng)業(yè)的項(xiàng)目有哪些)

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

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

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

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

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

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

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

                  2022年11月14日

                聯(lián)系我們

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