當前位置: 華文星空 > 新聞

Java21新特性 – switch模式匹配

2024-01-27新聞

Switch模式匹配功能首次在 Java SE 17 中預覽,在Java21版本中成為永久性功能。這意味著它可以在任何為 Java SE 21 編譯的程式中使用,而無需啟用預覽功能。

switch模式匹配由JEP 406提出 ,隨後在 JEP 420、427和433 中得到完善。它與記錄模式功能共同發展,因為這兩個功能之間關系緊密,互動很多。此 JEP 建議根據持續的經驗和反饋,透過進一步的小改進來最終在Java 21中確定該功能。

接下來,我們一起來看下switch模式匹配這個新特性!

1. switch模式匹配作用

透過switch運算式和語句的模式匹配來增強Java程式語言。透過將模式匹配擴充套件到switch,可以針對多個模式測試運算式,每個模式都有一個特定的操作,從而可以簡潔、安全地表達復雜的面向數據的查詢。

2. switch模式匹配使用範例

2.1 單匹配,不用再寫break,支持返回值

@Test void testSwitch (){ String day = "MONDAY" ; String i = switch ( day ) { case "MONDAY" -> "星期1" ; case "TUESDAY" -> "星期2" ; case "WEDNESDAY" -> "星期3" ; case "THURSDAY" -> "星期4" ; case "FRIDAY" -> "星期5" ; case "SATURDAY" -> "星期6" ; case "SUNDAY" -> "星期7" ; default -> "未知" ; }; System . out . println ( i ); }

2.2 執行多行程式碼,可使用yield返回

@Test void testSwitch (){ String day = "MONDAY" ; String i = switch ( day ) { case "MONDAY" -> { System . out . println ( "又要上班了..." ); yield "星期1" ; }; case "TUESDAY" -> "星期2" ; case "WEDNESDAY" -> "星期3" ; case "THURSDAY" -> "星期4" ; case "FRIDAY" -> "星期5" ; case "SATURDAY" -> "星期6" ; case "SUNDAY" -> "星期7" ; default -> "未知" ; }; System . out . println ( i ); }

2.3 多匹配,直接逗號分割

@Test void testSwitch (){ String day = "MONDAY" ; int i = switch ( day ) { case "MONDAY" -> "星期 1" ; case "TUESDAY" -> "星期2" ; case "WEDNESDAY" -> "星期3" ; case "THURSDAY" -> "星期4" ; case "FRIDAY" -> "星期5" ; case "SATURDAY" , "SUNDAY" -> "周末" ; default -> "未知" ; }; System . out . println ( i ); }

2.4 匹配增強

比如java21版本之前,我們根據不同型別數據格式化輸出:

// java21版本之前 static String formatter ( Object obj ) { String formatted = "unknown" ; if ( obj instanceof Integer i ) { formatted = String . format ( "int %d" , i ); } else if ( obj instanceof Long l ) { formatted = String . format ( "long %d" , l ); } else if ( obj instanceof Double d ) { formatted = String . format ( "double %f" , d ); } else if ( obj instanceof String s ) { formatted = String . format ( "String %s" , s ); } return formatted ; }

以上程式碼得益於instanceof運算式看上去還不錯,但是並不完美,我們可以考慮擴充套件 switch 語句和運算式,使其適用於任何型別,並允許 case 帶有模式的標簽而不僅僅是常量。這樣的改進將使我們的程式碼更加清晰、可靠和靈活,如下:

//java21 static String formatterPatternSwitch ( Object obj ) { return switch ( obj ) { case Integer i -> String . format ( "int %d" , i ); case Long l -> String . format ( "long %d" , l ); case Double d -> String . format ( "double %f" , d ); case String s -> String . format ( "String %s" , s ); default -> o . toString (); }; }

2.5 對於null處理

Java21以前, 如果選擇器運算式的計算結果為null,則switch語句和運算式會丟擲空指標異常,但是現在可以直接對null進行判斷,類似如下:

static void testFooBar ( String s ) { switch ( s ) { case null -> System . out . println ( "Oops" ); case "Foo" , "Bar" -> System . out . println ( "Great" ); default -> System . out . println ( "Ok" ); } }

3.總結

以上就是Java21新特性 – switch模式匹配的全部內容,如有補充請留言。