文章目录 1. switch模式匹配作用 2. switch模式匹配使用示例 2.1 单匹配,不用再写break,支持返回值 2.2 执行多行代码,可使用yield返回 2.3 多匹配,直接逗号分割 2.……
文
章
目
录
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模式匹配的全部内容,如有补充请留言。
还没有评论呢,快来抢沙发~