switch 语句
多分支选择结构,适合处理离散值的分支判断。
基本语法
传统写法
java
int day = 3;
String result;
switch (day) {
case 1:
result = "星期一";
break;
case 2:
result = "星期二";
break;
case 3:
result = "星期三";
break;
case 4:
result = "星期四";
break;
case 5:
result = "星期五";
break;
case 6:
result = "星期六";
break;
case 7:
result = "星期日";
break;
default:
result = "未知";
}
System.out.println(result); // 星期三switch 的四个要素:
| 元素 | 说明 |
|---|---|
| switch | 开关关键字 |
| case | 分支标签 |
| break | 跳出 switch(可选) |
| default | 默认分支(可选) |
switch 穿透
不使用 break 实现多值合并
相邻的 case 可以不加 break,实现相同的处理逻辑。
java
int score = 85;
String grade;
switch (score / 10) {
case 10:
case 9:
grade = "A";
break; // 10 和 9 都执行到这里
case 8:
grade = "B";
break;
case 7:
grade = "C";
break;
default:
grade = "D";
}
System.out.println(grade); // B搭配枚举和字符串
枚举类型
java
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
Season season = Season.SUMMER;
switch (season) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}字符串(JDK 7+)
java
String status = "active";
switch (status) {
case "active":
System.out.println("活跃用户");
break;
case "inactive":
System.out.println("非活跃用户");
break;
case "banned":
System.out.println("被封禁用户");
break;
default:
System.out.println("未知状态");
}JDK 12+ 增强特性
箭头表达式
用 -> 替代冒号,不需要 break,且更简洁。
java
String result = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4 -> "星期四";
case 5 -> "星期五";
case 6, 7 -> "周末"; // 多个值合并
default -> "未知";
};多值合并
用逗号分隔多个值,简化穿透逻辑。
java
int score = 85;
String grade = switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
default -> "D";
};yield 关键字(JDK 13+)
在箭头表达式块中返回值。
java
String result = switch (status) {
case "active" -> {
System.out.println("处理活跃状态");
yield "活跃";
}
case "inactive" -> {
System.out.println("处理非活跃状态");
yield "非活跃";
}
default -> "未知";
};完整示例
获取星期名称
java
// 传统写法
public String getDayName(int day) {
switch (day) {
case 1: return "星期一";
case 2: return "星期二";
case 3: return "星期三";
case 4: return "星期四";
case 5: return "星期五";
case 6: return "星期六";
case 7: return "星期日";
default: return "无效日期";
}
}
// JDK 12+ 写法
public String getDayName(int day) {
return switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4 -> "星期四";
case 5 -> "星期五";
case 6, 7 -> "周末";
default -> "无效日期";
};
}带逻辑的写法
java
public String getTrafficInfo(String vehicleType) {
return switch (vehicleType) {
case "car" -> {
int speed = calculateSpeed();
yield "车速: " + speed + " km/h";
}
case "bike" -> {
int speed = calculateSpeed();
yield "车速: " + speed + " km/h";
}
case "bus" -> "限速 50 km/h";
default -> "未知类型";
};
}枚举与增强 switch
java
public enum Color { RED, GREEN, BLUE }
public String getColorName(Color color) {
return switch (color) {
case RED -> "红色";
case GREEN -> "绿色";
case BLUE -> "蓝色";
};
}注意事项
枚举 switch 的完整性
增强 switch 编译器会检查枚举是否覆盖所有情况。
java
enum Status { ACTIVE, INACTIVE, BANNED }
// ❌ 传统 switch:可能遗漏 case
switch (status) {
case ACTIVE:
// ...
break;
// 缺少 INACTIVE 和 BANNED
}
// ✅ 增强 switch:编译器检查完整性
// 如果遗漏,编译器会报错
return switch (status) {
case ACTIVE -> "活跃";
case INACTIVE -> "非活跃";
case BANNED -> "封禁";
};null 检查
switch 不接受 null,会抛出 NullPointerException。
java
String status = null;
// ❌ NPE
switch (status) {
case "active":
// ...
}
// ✅ 先检查
if (status != null) {
switch (status) {
case "active":
// ...
}
}