Switch新特性

JEP 354: Switch Expressions (Second Preview)icon-default.png?t=O83Ahttps://openjdk.org/jeps/354

在新特性中引入了一种新的开关标签 case L ->,表示如果标签匹配,则仅执行标签右侧的代码,箭头后可以是表达式、块或者 throw 语句。

引入->开关后由于每个 case 匹配后只会执行箭头后的代码,因此我们可以不再使用 break 语句,从而避免了 break 所带来的混淆。

另一个好处是,在原来的 switch 中,如果在一个 case 后定义了局部变量,那么他的作用域就是整个 switch 语句,也就是说在一个 switch 语句中不能定义两个一样带局部变量。而在新特性中,开关标签 case L ->后定义的局部变量只会作用于这一个 case。例如:

switch (day) {
    case MONDAY:
    case TUESDAY:
        int temp = ...     // The scope of 'temp' continues to the }
        break;
    case WEDNESDAY:
    case THURSDAY:
        int temp2 = ...    // Can't call this variable 'temp'
        break;
    default:
        int temp3 = ...    // Can't call this variable 'temp'
}

//而在新的switch中,可以重复:
switch (i){
            case 1 -> {
                int a = 1;  
                System.out.println(a);
            }
            case 2 -> {
                int a = 2;  // 同样将临时变量定义为a
                System.out.println(a);
            }
            default -> {
                int a = 2;  // 同样将临时变量定义为a
                System.out.println(a);
            }
        }

另一个特点是我们可以扩展 switch 语句为一个表达式。表达式的结果可以用于给其他变量赋值,直接使用 sout 输出等。如果 ->后直接一个值,则该值代表 switch 表达式的结果。如果 ->是一个代码块,则可以使用 yield关键字来指定表达式的值。

eg:

int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值