switch语句在JDK8和JDK17的区别

1. switch 作为表达式(Switch Expressions)

JDK 17

✅ 支持 switch 表达式(返回一个值,可赋值给变量)
✅ 使用 -> 箭头语法(避免 break 穿透问题)
✅ 支持 yield 返回值(在代码块中显式返回值)

示例:

String dayType = switch (day) {
    case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Weekday";
    case "Saturday", "Sunday" -> "Weekend";
    default -> "Unknown";
};

JDK 8

❌ 只能是语句(不能直接返回结果)
❌ 必须用 : 和 break(容易忘记 break 导致穿透)

示例:

String dayType;
switch (day) {
    case "Monday":
    case "Tuesday":
    case "Wednesday":
    case "Thursday":
    case "Friday":
        dayType = "Weekday";
        break;
    case "Saturday":
    case "Sunday":
        dayType = "Weekend";
        break;
    default:
        dayType = "Unknown";
}

2. 多 case 匹配(Multiple Case Labels)

JDK 17

✅ 支持逗号分隔多个 case(更简洁)

case "Monday", "Tuesday", "Wednesday" -> "Weekday";

JDK 8

❌ 必须堆叠多个 case(冗长)

case "Monday":
case "Tuesday":
case "Wednesday":
    dayType = "Weekday";
    break;

3. yield 关键字(JDK 13+)

JDK 17

✅ 在代码块中使用 yield 返回值

int numLetters = switch (day) {
    case "Monday" -> 6;
    case "Tuesday" -> 7;
    case "Wednesday" -> {
        System.out.println("Midweek day");
        yield 9;  // 显式返回
    }
    default -> -1;
};

JDK 8

❌ 不支持 yield,只能赋值给变量


4. 模式匹配(Pattern Matching,JDK 17 预览功能)

JDK 17

✅ 支持类型模式匹配instanceof + switch 结合)

Object obj = "Hello";
String result = switch (obj) {
    case Integer i -> "Integer: " + i;
    case String s -> "String: " + s;
    default -> "Unknown";
};

JDK 8

❌ 不支持模式匹配,只能用 if-else + instanceof


5. null 处理

JDK 17

✅ 可以显式匹配 null(避免 NullPointerException

switch (str) {
    case null -> System.out.println("Null");
    case "foo" -> System.out.println("Foo");
    default -> System.out.println("Other");
}

JDK 8

❌ 遇到 null 会抛出 NullPointerException


总结

特性JDK 8JDK 17
switch 表达式❌ 不支持✅ 支持(-> 语法)
多 case 匹配❌ 必须堆叠✅ 逗号分隔
yield 返回值❌ 不支持✅ 支持
模式匹配❌ 不支持✅ 支持(预览)
null 处理❌ 抛出 NPE✅ 可匹配 null

JDK 17 的 switch 更现代化,减少了错误,提高了可读性! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值