Java 14 之模式匹配,非常贊的一個新特性!


前些天 JDK 14 發布了:
重磅:Java 14 正式發布了!

今天棧長帶大家來嘗嘗 Java14 的鮮,雖然大家都在用着 Java8 或者以下版本,但多學習了解一點總不是壞事。

比如出去面試啥的,面試官總會問你在學什么新技術,多學習下新知識可以出去和面試官吹水了。如果面試官會,你不會,​那你不就 OUT 了!

JDK14 下載安裝

首先打開 JDK14 的下載地址:

https://www.oracle.com/java/technologies/javase-jdk14-downloads.html

選擇對應系統的版本安裝。

安裝細節就不展開了,相信大家都會,我這里已經裝好了,來看下 JDK 版本。

$ java -version
java version "14" 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)

Java14 is ready, let's go!!

開篇:instanceof 模式匹配

instanceof模式匹配,相當於增強的 instanceof,這目前還是 JDK 14 中的預覽特性:

https://openjdk.java.net/jeps/305

模式匹配的到來將使得 instanceof 變得更簡潔、更安全,為什么這么說,繼續往下看。

在 Java 14 之前,我們判斷一個對象是否是某個類派生的實例,是這樣使用 instanceof 的:

if (object instanceof Kid) {
    Kid kid = (Kid) object;
    // ...
}

以上程序做了三件事:

1)判斷 object 是否是 Kid 的實例

2)把 object 強制轉換為 Kid 類型

3)創建了一個局部變量:kid

雖然這段程序很簡單,大家也都是這么用的,並沒有什么問題。

但這不是最佳的編寫方式,判斷完之后為什么還要進行一次類型強轉?這應該不是必需的,而且強轉的時候可能類型出錯。

假如,我現在想加一個判斷是不是 Kiddle 的實例:

if (object instanceof Kid) {
	Kid kid = (Kid) object;
	// ...
} else if (object instanceof Kiddle) {
	Kid kid = (Kid) object;
	// ...
}

這時候類型判斷完后忘了修改 Kid -> Kiddle,結果還是強轉給 Kid,這時候有兩種結果:

1)Kiddle 是 Kid 的子類,不報錯

2)Kiddle 不是 Kid 的子類,報錯

心態是不是要崩了?

不管怎樣,這程序是不健壯了,這確實不是很好的體驗,模式匹配就可以避免這種問題的出現。模式匹配其實很多語言已經有了,Java 來得比較晚,但總歸是來了,來看下模式匹配該怎么寫!

if (object instanceof Kid kid) {
    // ...
} else if (object instanceof Kiddle kiddle) {
	// ...
}

是不是看起來很爽?判斷完類型后可以直接拿來用!

模式匹配其實就是對判斷類型進行匹配,匹配成功后就把對象強轉賦值給類型后面的變量。

注意,這個變量只有在匹配成功后才會創建和賦值,而且作用域僅只能在當前判斷分支里面,如果用在分支外會出現編譯錯誤。

另外,回到最開始的程序,如果同時出現很多個 instanceof 判斷:

if (object instanceof Kid1) {
	Kid1 kid1 = (Kid1) object;
	// ...
} else if (object instanceof Kid2) {
	Kid2 kid2 = (Kid2) object;
	// ...
} else if (object instanceof Kid3) {
	Kid3 kid3 = (Kid3) object;
	// ...
} else if (object instanceof Kid4) {
	Kid4 kid4 = (Kid4) object;
	// ...
} else if (object instanceof Kid5) {
	Kid5 kid5 = (Kid5) object;
	// ...
} else if (object instanceof Kid6) {
	Kid6 kid6 = (Kid6) object;
	// ...
} else if (object instanceof Kid7) {
	Kid7 kid7 = (Kid7) object;
	// ...
} else if (object instanceof Kid8) {
	Kid8 kid8 = (Kid8) object;
	// ...
}

大量的類型轉換,這程序會變得有多冗長??

所以,模式匹配不但提高了程序的安全性、健壯性,另一方面,也減少了大量不必要的類型轉換,大大提高了程序的簡潔性、可讀性。

另外,switch 在 Java 12 中加強了:Java 12 騷操作, String居然還能這樣玩!。如果可以使用 switch 一起結合使用,那該多好?這是以后計划的事了。

總結

instanceof模式匹配這真是 Java 中的又一能力的提升,個人覺得很實用,不會覺得它多余或者像 Java8 中的 Lambda、函數式編程晦澀難懂。

好了,今天就到這了,關注微信公眾號:Java技術棧,新特性實戰陸續更新中,公眾號第一時間推送。歷史 Java 8 - 14 新特性教程可以在公眾號回復 java 獲取。

棧長原創和整理不易,覺得文章不錯,在看、轉發分享給更多的朋友們,總能幫助有需要的人,大家一起流弊~

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

生活很美好,明天見~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM