Java21新特性 – switch模式匹配(JEP 441)

后端 潘老师 6个月前 (11-02) 310 ℃ (0) 扫码查看

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


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10573.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】