行业资讯 2025年08月6日
0 收藏 0 点赞 994 浏览 2453 个字
摘要 :

文章目录 1. switch模式匹配作用 2. switch模式匹配使用示例 2.1 单匹配,不用再写break,支持返回值 2.2 执行多行代码,可使用yield返回 2.3 多匹配,直接逗号分割 2.……




  • 1. switch模式匹配作用
  • 2. switch模式匹配使用示例
    • 2.1 单匹配,不用再写break,支持返回值
    • 2.2 执行多行代码,可使用yield返回
    • 2.3 多匹配,直接逗号分割
    • 2.4 匹配增强
    • 2.5 对于null处理
  • 3.总结

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.zuozi.net/9632.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号