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 8 | JDK 17 |
---|---|---|
switch 表达式 | ❌ 不支持 | ✅ 支持(-> 语法) |
多 case 匹配 | ❌ 必须堆叠 | ✅ 逗号分隔 |
yield 返回值 | ❌ 不支持 | ✅ 支持 |
模式匹配 | ❌ 不支持 | ✅ 支持(预览) |
null 处理 | ❌ 抛出 NPE | ✅ 可匹配 null |
JDK 17 的 switch
更现代化,减少了错误,提高了可读性!