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