Java12 Switch语句

作者 | 2020年3月18日

在Java12中,增强提案JEP 325: Switch Expressions对传统的switch语句添加了下面这些新特性:

  • 支持在一行写多个Case标签
  • 可以使用break返回值(在Java13中已经被yield替换)
  • 可以使用箭头返回值

注意:Switch表达式是属于“尝鲜版”的功能,默认是禁用的。

在学习switch的新写法之前,先来复习一下旧的写法:

JEP325.java

package cc.myexample;

public class JEP325 {

    public static void main(String[] args{

        System.out.println(getTextBefore12(1));
        System.out.println(getTextBefore12(3));
        System.out.println(getTextBefore12(6));
        System.out.println(getTextBefore12(10));

    }

    // 旧的switch语句写法
    private static String getTextBefore12(int number{
        String result = "";
        switch (number) {
            case 1:
            case 2:
                result = "one or two";
                break;
            case 3:
                result = "three";
                break;
            case 4:
            case 5:
            case 6:
                result = "four or five or six";
                break;
            default:
                result = "unknown";
        };
        return result;
    }

}

输出

one or two
three
four or five or six
unknown

例子1: 一行写多个Case标签

在Java12中可以使用逗号分割多个Case标签。

private static String getTextMultipleLabels(int number) {
    String result = "";
    switch (number) {
        case 12:
            result = "one or two";
            break;
        case 3:
            result = "three";
            break;
        case 456:
            result = "four or five or six";
            break;
        default:
            result = "unknown";
    };
    return result;
}

例子2: 通过Break返回值

在Java12中,可以直接通过break关键字返回值(有点像return关键字)。

private static String getTextViaBreak(int number) {
    String result = switch (number) {
        case 1:
        case 2:
            break "one or two"; 
        case 3:
            break "three";
        case 4:
        case 5:
        case 6:
            break "four or five or six";
        default:
            break "unknown";
    };
    return result;
}

注意: 在Java13中已经使用yield替换了break

例子3: 通过箭头返回值

在Java12中还有一种比例子2更简单的方法返回值,那就是使用->

private static String getTextViaArrow(int number) {
    String result = switch (number) {
        case 12 -> "one or two";
        case 3 -> "three";
        case 456 -> "four or five or six";
        default -> "unknown";
    };
    return result;
}

例子4: 开启“尝鲜版”功能

”尝鲜版“的功能默认是关闭的,直接编译会报错:

$ javac JEP325.java
JEP325.java:39: error: multiple case labels are a preview feature and are disabled by default.
            case 1, 2:
                    ^
  (use --enable-preview to enable multiple case labels)

JEP325.java:56: error: switch expressions are a preview feature and are disabled by default.
        String result = switch (number) {
                        ^
  (use --enable-preview to enable switch expressions)
JEP325.java:75: error: switch rules are a preview feature and are disabled by default.
            case 1, 2 -> "one or two";
                      ^
  (use --enable-preview to enable switch rules)
3 errors

我们需要手动地开启“尝鲜版”功能:

编译

javac --enable-preview --release 12 JEP325.java

运行

java --enable-preview JEP325

发表评论

电子邮件地址不会被公开。 必填项已用*标注