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模式匹配的全部內容,如有補充請留言。