当前位置: 华文星空 > 新闻

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