JDK 14的新特性:switch表達式

簡介

switch的新特性可是源遠流長,早在JDK 12就以預覽功能被引入了,最終在JDK 14成爲了正式版本的功能:JEP 361: Switch Expressions (Standard)。

其實Switch新增的功能有兩個,一個就是可以連寫case,一個就是switch可以帶返回值了。

寫在前面

就在我興致勃勃的想要創建一個以switch命名的package的時候,突然間發現在IDEA中居然創建不java類了。

經過我的再三嘗試,反覆改名,終於被我發現了隱藏在裏面的小祕密:

java key word是不能被用在package名字中的。好吧,一直以來package的名字就那麼多個,現在想創建一個拉風一點的,居然發現還有這樣一個規則。

那麼java key word有哪些呢? 下面就是了。

連寫case

先看一個老版本的例子:

    @Test
    public void useOldSwitch(){
        switch (MONDAY) {
            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;
        }
    }

上面的例子中,我們想要匹配所有的星期,然後打印出相應的結果。寫了很多個case語句,不美觀。

再看一下新版本的例子:

    @Test
    public void useNewSwitch(){
        switch (MONDAY) {
            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);
        }
    }

一個漂亮的連寫,將一切都帶走。

注意這裏switch語句沒有返回值,所以並不需要default語句。

switch返回值

考慮一個在switch中賦值的情況:

    @Test
    public void oldSwitchWithReturnValue(){
        int numLetters;
        switch (MONDAY) {
            case MONDAY:
            case FRIDAY:
            case SUNDAY:
                numLetters = 6;
                break;
            case TUESDAY:
                numLetters = 7;
                break;
            case THURSDAY:
            case SATURDAY:
                numLetters = 8;
                break;
            case WEDNESDAY:
                numLetters = 9;
                break;
            default:
                throw new IllegalStateException("這天沒發見人!");
        }
    }

傳統方式我們需要定義一個局部變量,並在case中給這個局部變量賦值。

我們看下怎麼使用新版的switch替換:

    @Test
    public void newSwitchWithReturnValue(){
        int numLetters = switch (MONDAY) {
            case MONDAY, FRIDAY, SUNDAY -> 6;
            case TUESDAY                -> 7;
            case THURSDAY, SATURDAY     -> 8;
            case WEDNESDAY              -> 9;
            default -> throw new IllegalStateException("這天沒發見人!");
        };
    }

是不是非常簡單。

注意,這裏需要一個default操作,否則會報編譯錯誤。因爲可能存在未遍歷的值。

yield

上面的switch返回值的情況,如果case後面的表達式比較複雜,那麼就需要使用大括號來圍起來。這種情況我們需要使用到yield來返回要返回的值。

    @Test
    public void withYield(){
        int result = switch (MONDAY) {
            case MONDAY: {
                yield 1;
            }
            case TUESDAY: {
                yield 2;
            }
            default: {
                System.out.println("不是MONDAY,也不是TUESDAY!");
                yield 0;
            }
        };
    }

總結

本文介紹了JDK14中的switch新特性。也是唯一正式版本的新特性…

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/jdk-14-switch/

本文來源:flydean的博客

歡迎關注我的公衆號:程序那些事,更多精彩等着您!

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