Java 14 祭出增強版 switch,真香!!

Java14:棧長,我還有機會嗎?

棧長:必須有!今天說下switch!

關注Java技術棧公衆號的朋友應該都知道,switch 在 JDK 12 中進行增強了,並且在 JDK 12/13 中一直是預覽特性,剛出來的時候,棧長也第一時間對 switch 特性進行了分享:

Java 12 騷操作, switch居然還能這樣玩!

現在隨着 JDK 14 的發佈,switch已經成爲標準特性了,意外的是對 JDK 12 又進行了一些調整和增強,現在我們來看 Java 14 中的 switch 怎麼玩吧。

本文是 Java 14 新特性的第 4 篇教程,也是對 JDK 12 switch 那篇的增強和修訂!

Java 14 switch

Java 14 switch 有以下幾點特色:

1、箭頭表達式

箭頭語法 ->,類似 Java 8 中的 Lambda 表達式,先來定義一個枚舉類:

public enum Status {
    OPEN, INIT, PROCESS, PENDING, CLOSE;
}

傳統的寫法:

private static void test(Status status) {
    int result = 0;
    switch (status) {
        case OPEN:
            result = 1;
            break;
        case PROCESS:
            result = 2;
            break;
        case PENDING:
            result = 2;
            break;
        case CLOSE:
            result = 3;
            break;
        default:
            throw new RuntimeException("狀態不正確");
    }
    System.out.println("result is " + result);
}

Java 14+ 後可以這樣用:

private static void test(Status status) {
    var result = switch (status) {
        case OPEN -> 1;
        case PROCESS, PENDING -> 2;
        case CLOSE -> 3;
        default -> throw new RuntimeException("狀態不正確");
    };
    System.out.println("result is " + result);
}

可以在 switch 語句塊中返回值給一個變量(不是必須),多個 case 條件可以寫在一行,用逗號分開,並且可以省略 break 關鍵字。

2、yield 關鍵字

yield 用來返回值,並跳出當前 switch 語句塊,來看下面的示例:

private static void test(Integer value) {
    int number = switch (value) {
        case 3:
            System.out.println("3");
            yield 3;
        case 5:
            System.out.println("5");
            yield 5;
        default:
            System.out.println("default");
            yield 0;
    };
    System.out.println(number);
}

示例中,每個 case 都帶了一個 yield 關鍵字返回值,也可以結合箭頭表達式同時使用:

private static void test(Status status) {
    var result = switch (status) {
        case OPEN -> 1;
        case PROCESS, PENDING -> 2;
        case CLOSE -> {
            System.out.println("closed");
            yield 3;
        }
        default -> throw new RuntimeException("狀態不正確");
    };
    System.out.println("result is " + result);
}

示例代碼看了都懂吧,是不是很騷?

背後的祕密

背後的祕密是什麼呢?

反編譯上面那個例子的字節碼再看下:

private static void test(Status status) {
    byte var10000;
    switch(status) {
    case OPEN:
        var10000 = 1;
        break;
    case PROCESS:
    case PENDING:
        var10000 = 2;
        break;
    case CLOSE:
        System.out.println("closed");
        var10000 = 3;
        break;
    default:
        throw new RuntimeException("狀態不正確");
    }

    int result = var10000;
    System.out.println("result is " + result);
}

可以看到全部是傳統寫法了,原來又是一個語法糖。

好了,今天的分享就到這,收藏轉發一下吧,雖然現在 JDK 8 是主流,但多學習瞭解不是壞事,日後必定有用!

想學習更多的 Java 8 ~ 14 系列新特性教程,請搜索關注微信公衆號:Java技術棧,在公衆號後臺回覆:java,我寫了一大堆教程了,都是乾貨。

關注公衆號Java技術棧回覆"面試"獲取我整理的2020最全面試題及答案。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章