switch 右箭头用法

右箭头 -> 是 Java 14 引入的 switch 表达式 的新语法,它是现代 Java 中 switch 语句的更简洁、更强大的写法。

传统 switch 语句 vs 新的 switch 表达式
传统 switch 语句(Java 13 及之前)
#java
// 传统写法 - 需要 break,容易遗漏导致穿透
public static Vehicle createVehicle(String type) {
    Vehicle vehicle; //当前包级别访问权限。
    switch (type.toLowerCase()) {
        case "car":
            vehicle = new Car();
            break;  // 必须要有 break
        case "bike":
            vehicle = new Bike();
            break;  // 必须要有 break
        case "truck":
            vehicle = new Truck();
            break;  // 必须要有 break
        default:
            throw new IllegalArgumentException("未知的车辆类型: " + type);
    }
    return vehicle;
}

#新的 switch 表达式(Java 14+)
#java
// 新写法 - 使用 -> 箭头语法
public static Vehicle createVehicle(String type) {
    return switch (type.toLowerCase()) {
        case "car" -> new Car();
        case "bike" -> new Bike();
        case "truck" -> new Truck();
        default -> throw new IllegalArgumentException("未知的车辆类型: " + type);
    };
}

箭头语法 -> 的特点
1. 自动返回,不需要 break
#java
int day = 3;
String dayType = switch (day) {
    case 1, 2, 3, 4, 5 -> "工作日";  // 执行右边表达式后自动返回,不会穿透
    case 6, 7 -> "周末";
    default -> "无效天数";
};
System.out.println(dayType); // 输出: 工作日

2. 支持多行代码块
#java
String result = switch (value) {
    case 1 -> "一";
    case 2 -> {
        System.out.println("处理数字 2");
        yield "二";  // 在代码块中使用 yield 返回值
    }
    case 3 -> {
        String message = "这是数字三";
        yield message.toUpperCase();
    }
    default -> "其他";
};

3. 支持表达式返回值
#java
// switch 表达式可以直接返回值
int num = 2;
String numberWord = switch (num) {
    case 1 -> "one";
    case 2 -> "two";    // 这个表达式的结果就是返回值
    case 3 -> "three";
    default -> "many";
};

System.out.println(numberWord); // 输出: two
#完整的 switch 表达式特性

1. 多个 case 标签
#java
String season = switch (month) {
    case 12, 1, 2 -> "冬季";
    case 3, 4, 5 -> "春季";
    case 6, 7, 8 -> "夏季";
    case 9, 10, 11 -> "秋季";
    default -> "无效月份";
};

2. 类型匹配(Java 21+ 预览特性)
#java
// Java 21 的模式匹配(预览特性)
Object obj = "Hello";
String result = switch (obj) {
    case Integer i -> "整数: " + i;
    case String s -> "字符串: " + s;
    case Double d -> "小数: " + d;
    case null -> "空值";
    default -> "其他类型";
};

3. 守卫条件(Guard conditions)
#java
String response = switch (httpStatus) {
    case 200 -> "成功";
    case 404 -> "未找到";
    case 500 -> "服务器错误";
    case int code when code >= 400 && code < 500 -> "客户端错误";
    case int code when code >= 500 && code < 600 -> "服务器错误";
    default -> "未知状态";
};

#实际应用示例
#示例 1:计算器操作
#java
public class Calculator {
    public static int calculate(int a, int b, String operator) {
        return switch (operator) {
            case "+" -> a + b;
            case "-" -> a - b;
            case "*" -> a * b;
            case "/" -> {
                if (b == 0) {
                    throw new ArithmeticException("除数不能为零");
                }
                yield a / b;
            }
            case "%" -> a % b;
            default -> throw new IllegalArgumentException("不支持的操作符: " + operator);
        };
    }
    
    public static void main(String[] args) {
        System.out.println(calculate(10, 2, "+")); // 12
        System.out.println(calculate(10, 2, "/")); // 5
    }
}

#示例 2:工作日判断
#java
public class WorkdayChecker {
    public static String getDayInfo(String day) {
        return switch (day.toLowerCase()) {
            case "monday", "tuesday", "wednesday", "thursday" -> {
                String message = day + " 是工作日";
                yield message + ",需要努力工作!";
            }
            case "friday" -> "周五,马上周末了!";
            case "saturday", "sunday" -> "周末,好好休息!";
            default -> "无效的星期几";
        };
    }
    
    public static void main(String[] args) {
        System.out.println(getDayInfo("Monday"));    // Monday 是工作日,需要努力工作!
        System.out.println(getDayInfo("Friday"));    // 周五,马上周末了!
        System.out.println(getDayInfo("Saturday"));  // 周末,好好休息!
    }
}

# 3:HTTP 状态码处理
#java
public class HttpStatusHandler {
    public static String handleStatus(int statusCode) {
        return switch (statusCode) {
            case 200, 201, 204 -> "成功";
            case 400 -> "错误请求";
            case 401 -> "未授权";
            case 403 -> "禁止访问";
            case 404 -> "未找到";
            case 500 -> "内部服务器错误";
            case 503 -> "服务不可用";
            case int code when code >= 100 && code < 200 -> "信息响应";
            case int code when code >= 300 && code < 400 -> "重定向";
            default -> "未知状态码";
        };
    }
}

#与传统 switch 的对比总结
特性		|传统 switch 语句		|新的 switch 表达式
语法		|case value: + break	|case value -> expression
返回值		|不能直接返回值			|可以直接返回值
穿透		|会穿透,需要 break		|不会穿透,自动跳出
代码块		|使用冒号和 break		|使用 -> { } 和 yield
空安全		|不支持					|支持 case null 处理
模式匹配	|不支持					|Java 21+ 支持模式匹配

#版本要求
Java 14:switch 表达式作为正式特性引入
Java 17:长期支持版本,推荐使用
Java 21:增加了模式匹配等增强功能

#最佳实践
优先使用箭头语法:新的语法更安全、更简洁
处理所有情况:确保有 default 分支或覆盖所有可能值
保持简洁:如果逻辑复杂,考虑提取到独立方法中
利用类型检查:switch 表达式是类型安全的

#java
// ✅ 推荐写法
return switch (value) {
    case "A" -> handleCaseA();
    case "B" -> handleCaseB();
    default -> handleDefault();
};

// ❌ 避免过于复杂
return switch (value) {
    case "A" -> {
        // 这里包含大量业务逻辑...
        yield result;
    }
    // ... 其他case也包含大量逻辑
};
总结: 右箭头 -> 是 Java 14+ 中 switch 表达式的新语法,它使代码更简洁、更安全,是现代 Java 开发推荐使用的写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值