Java 12 新特性—Switch 表达式

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

Switch 语句,这是 Java 入门中控制流程的部分,它是除 if 语句外的另外一种条件判断,提供了比连续的 if-else 语句更加清晰和结构化的选择机制。大明哥相信学过 Java 的小伙伴没有不知道怎么使用它吧。

从最初的 Switch 语句仅支持整型数据类型(如 byteshortchar, 和 int),以及枚举类型(Java 5 引入)。到后面的 Java 7 开始支持 String 类型,虽然 Java 7 这一改进极大地增加了 Switch 语句的灵活性和实用性,但是 Switch 语句依然存在一些显著的缺陷:

  1. "Fall-through" 行为:在没有显式 break 语句的情况下,Switch 语句会从一个 case "穿透" 到下一个 case,忽略了这个会导致不可饶恕的错误。
  2. 代码冗余:每个 case,我们都需要重复类似的代码结构,增加了代码的冗余和维护难度。

为了解决 Switch 的现存问题,Java 12 引入全新的Switch 表达式,该表达式不仅增强了 Switch 语句的功能,还大幅提高了其灵活性和表达能力。

新的 Switch 表达式引入了 -> 操作符,用于替代传统的冒号(:)。与传统的 Switch 语句不同,使用 -> 的 case 分支不会出现 "fall-through" 现象,因此不需要 break 语句来防止穿透。这减少了代码的复杂性,也降低了编程错误的风险。

通过下面一个例子来说明新的 Switch 表达式和老的 Switch 之间的差异,从这些差异中就可以看出 Java 12 中的 Switch 表达式的增强不分。

  • 老的 Switch 语句
    public static String getTypeOfDay(String day) {
        String typeOfDay;
        switch (day) {
            case "MONDAY":
            case "TUESDAY":
            case "WEDNESDAY":
            case "THURSDAY":
            case "FRIDAY":
                typeOfDay = "Weekday";
                break;
            case "SATURDAY":
            case "SUNDAY":
                typeOfDay = "Weekend";
                break;
            default:
                typeOfDay = "Unknown";
        }
        return typeOfDay;
    }

使用传统的 Switch 语句来确定一周中的某一天是工作日还是周末。注意每个 case 之后需要 break 语句,否则会发生穿透。

  • 新的 Switch 表达式

对于上面的程序,新的 Switch 表达式写法如下:

    public static String getTypeOfDay(String day) {
        String typeOfDay = switch (day) {
            case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
            case "SATURDAY", "SUNDAY" -> "Weekend";
            default -> "Unknown";
        };
        return typeOfDay;
    }

是不是简洁了很多。从这里可以看出他们之间的差异如下:

  • 返回值:老的 Switch 仅仅只是语句,用来控制流程的,无法返回值。但是新的 Switch 可以作为表达式使用,支持返回值。
  • ->** 代替**:老的 Switch 需要在每个案例后面使用 break ,否则会发生“穿透”,而新的不需要,它会自动终止。
  • 多值匹配:老的 Switch 无法在一个案例标签中匹配多个值,而新的 Switch 表达式允许一个 case 匹配多个值,用"," 分割即可。
  • 更简洁的语法: 整体代码更简洁,易于阅读和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值