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模式匹配的全部内容,如有补充请留言。