本文主要介绍Java JDK13(Java 13)中,switch新特性的使用示例代码。Java switch语句的当前设计紧密遵循C和C ++之类的语言,并且默认情况下支持通过语义落入。尽管这种传统控制流通常可用于编写低级代码(例如用于二进制编码的解析器)(如switch在高级上下文中使用的那样),但其易于出错的性质开始超过其灵活性。

1、使用case L ->箭头标签的switch代码

1)JDK13以前的switch代码

switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}

2)JDK13新写法switch代码

switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}

2、使用case L -> 箭头标签简化的写法

除了case L :开关模块中的传统标签外,我们还提出了一种带有case L ->标签的简化形式。如果标签匹配,则仅执行箭头右侧的表达式或语句;否则,将不执行任何操作。没有失败。例如,给定以下switch使用新标签形式的语句:

static void howMany(int k) {
switch (k) {
case 1 -> System.out.println("one");
case 2 -> System.out.println("two");
default -> System.out.println("many");
}
}

如下代码:

howMany(1);
howMany(2);
howMany(3);

结果如下:

one
two
many

3、使用switch表达式

我们将扩展该switch语句,以便可以将其用作表达式。例如,howMany可以将以前的方法重写为使用switch表达式,因此它仅使用单个println。

static void howMany(int k) {
System.out.println(
switch (k) {
case 1 -> "one"
case 2 -> "two"
default -> "many"
}
);
}

在通常情况下,switch表达式将如下所示:

T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};

4、switch中使用yield返回值

大多数switch表达式在“ case L ->”开关标签的右侧都有一个表达式。如果需要一个完整的块,我们引入一个新的yield语句来产生一个值,该值成为封闭switch表达式的值。

int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};

这两个语句break带有或不带有标签)和yield便于在switch语句和switch表达式之间消除歧义:switch语句而不是switch表达式可以成为break语句的目标;和switch表达,但不是一个switch语句可以是一个目标yield的语句。

switch表达式必须以一个值正常完成,或者必须通过引发异常来突然完成。

int i = switch (day) {
    case MONDAY -> {
        System.out.println("Monday"); 
        // ERROR! Block doesn't contain a yield statement
    }
    default -> 1;
};
i = switch (day) {
    case MONDAY, TUESDAY, WEDNESDAY: 
        yield 0;
    default: 
        System.out.println("Second half of the week");
        // ERROR! Group doesn't contain a yield statement
};

控制语句,breakyieldreturncontinue,无法通过跳switch表达式,如在以下内容:

 for (int i = 0; i < MAX_VALUE; ++i) {
        int k = switch (e) { 
            case 0:  
                yield 1;
            case 1:
                yield 2;
            default: 
                continue z; 
                // ERROR! Illegal jump through a switch expression 
        };
    ...
    }

官方文档https://openjdk.java.net/jeps/354