Java:yield关键字

概述

我们可能会经常使用switch语句来实现从一个值到另一个值的转换。在早期版本的Java中,这需要我们将switch语句嵌入到一个单独的函数中,并使用每个case中的return语句,或者需要在每个case中将值赋给一个临时变量,以便在函数的后续部分中使用。

从Java 14开始,switch表达式中的yield关键字为我们提供了一种更好的实现方式。

yield关键字

yield关键字允许我们通过返回一个值来退出switch表达式,该值将成为switch表达式的值。

这意味着我们可以将switch表达式的值赋给一个变量。

语法

yield Expression ; 
  • yield语句通过使封闭的 switch 表达式产生一个指定的值来转移控制。
  • yield语句尝试将控制权转移给最内层的封闭switch表达式;这个被称为“yield目标”的封闭表达式随后立即正常完成,并且Expression的值就成为了switch表达式的值。
  • 如果一个 yield 语句没有 yield 目标,那么这是一个编译时错误。
  • 如果一个yield语句的表达式为void,那么这是一个编译时错误。

使用带箭头操作符的yield

package com.test.pkg1;

public class Test {
    
    enum WeekDay {
        MONDYA, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, STATURDAY, SUNDAY;
    }

    public static void main(String[] args) {
        int result = calculate(WeekDay.MONDYA);
        System.out.println(result);
        
        result = calculate(WeekDay.WEDNESDAY);
        System.out.println(result);
        
        result = calculate(WeekDay.THURSDAY);
        System.out.println(result);
    }
    
    public static int calculate(WeekDay d) {
        return switch (d) {
            case MONDYA, TUESDAY -> {
                System.out.println(1);
                yield 1;
            }
            case WEDNESDAY -> {
                System.out.println(2);
                yield 2;
            }
            default -> {
                System.out.println(3);
                yield 3;
            }
        };
    }
}

输出:

1
1
2
2
3
3

使用冒号分隔符的yield

package com.test.pkg1;

public class Test {
    
    enum WeekDay {
        MONDYA, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, STATURDAY, SUNDAY;
    }

    public static void main(String[] args) {
        int result = calculate(WeekDay.MONDYA);
        System.out.println(result);
        
        result = calculate(WeekDay.WEDNESDAY);
        System.out.println(result);
        
        result = calculate(WeekDay.THURSDAY);
        System.out.println(result);
    }
    
    public static int calculate(WeekDay d) {
        return switch (d) {
            case MONDYA:
            case TUESDAY:
                System.out.println(1);
                yield 1;
            case WEDNESDAY:
                System.out.println(2);
                yield 2;
            default:
                System.out.println(3);
                yield 3;
        };
    }
}

输出:

1
1
2
2
3
3

这段代码的行为与前一部分相同。但箭头操作符更清晰,也更不容易出现忘记yield(或break)语句的情况。

需要注意的是,我们不能在同一switch表达式中混合使用冒号和箭头这两种分隔符。

完备性

使用switch表达式和yield的另一个好处是,如果缺少case覆盖,我们会看到一个编译错误。让我们从使用箭头操作符的switch表达式中移除default case来验证一下:

return switch (d) {
    case MONDYA, TUESDAY -> {
        System.out.println(1);
        yield 1;
    }
    case WEDNESDAY -> {
        System.out.println(2);
        yield 2;
    }
};

上面的写法会给出编译错误提示:A Switch expression should cover all possible values
在这里插入图片描述

我们可以将default case加回来,或者我们可以具体地覆盖d 的所有可能值:

package com.test.pkg1;

public class Test {
    
    enum WeekDay {
        MONDYA, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, STATURDAY, SUNDAY;
    }

    public static void main(String[] args) {
        int result = calculate(WeekDay.MONDYA);
        System.out.println(result);
        
        result = calculate(WeekDay.WEDNESDAY);
        System.out.println(result);
        
        result = calculate(WeekDay.THURSDAY);
        System.out.println(result);
    }
    
    public static int calculate(WeekDay d) {
        return switch (d) {
            case MONDYA, TUESDAY -> {
                System.out.println(1);
                yield 1;
            }
            case WEDNESDAY -> {
                System.out.println(2);
                yield 2;
            }
            case THURSDAY, FRIDAY, STATURDAY, SUNDAY -> {
                System.out.println(3);
                yield 3;
            }
        };
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值