JDK14新特性之switch表達(dá)式的實(shí)現(xiàn)
簡介
switch的新特性可是源遠(yuǎn)流長,早在JDK 12就以預(yù)覽功能被引入了,最終在JDK 14成為了正式版本的功能:JEP 361: Switch Expressions (Standard)。
其實(shí)Switch新增的功能有兩個(gè),一個(gè)就是可以連寫case,一個(gè)就是switch可以帶返回值了。
寫在前面
就在我興致勃勃的想要?jiǎng)?chuàng)建一個(gè)以switch命名的package的時(shí)候,突然間發(fā)現(xiàn)在IDEA中居然創(chuàng)建不java類了。
經(jīng)過我的再三嘗試,反復(fù)改名,終于被我發(fā)現(xiàn)了隱藏在里面的小秘密:
java key word是不能被用在package名字中的。好吧,一直以來package的名字就那么多個(gè),現(xiàn)在想創(chuàng)建一個(gè)拉風(fēng)一點(diǎn)的,居然發(fā)現(xiàn)還有這樣一個(gè)規(guī)則。
那么java key word有哪些呢? 下面就是了。

連寫case
先看一個(gè)老版本的例子:
@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;
}
}
上面的例子中,我們想要匹配所有的星期,然后打印出相應(yīng)的結(jié)果。寫了很多個(gè)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);
}
}
一個(gè)漂亮的連寫,將一切都帶走。
注意這里switch語句沒有返回值,所以并不需要default語句。
switch返回值
考慮一個(gè)在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("這天沒發(fā)見人!");
}
}
傳統(tǒng)方式我們需要定義一個(gè)局部變量,并在case中給這個(gè)局部變量賦值。
我們看下怎么使用新版的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("這天沒發(fā)見人!");
};
}
是不是非常簡單。
注意,這里需要一個(gè)default操作,否則會報(bào)編譯錯(cuò)誤。因?yàn)榭赡艽嬖谖幢闅v的值。
yield
上面的switch返回值的情況,如果case后面的表達(dá)式比較復(fù)雜,那么就需要使用大括號來圍起來。這種情況我們需要使用到y(tǒng)ield來返回要返回的值。
@Test
public void withYield(){
int result = switch (MONDAY) {
case MONDAY: {
yield 1;
}
case TUESDAY: {
yield 2;
}
default: {
System.out.println("不是MONDAY,也不是TUESDAY!");
yield 0;
}
};
}
1.case L -> 標(biāo)簽取消了貫穿功能 case后面的常量可以使用逗號來分割多個(gè)常量
看下代碼
public class SwitchTest {
public static void main(String[] args) {
Weekday day = Weekday.MON; //初始化一個(gè)枚舉變量
//case L:標(biāo)簽具有貫穿功能
switch (day){//不需要break;
case MON, TUE, WEN -> {
System.out.println("上半周");
String s = "abc"; //局部變量只在當(dāng)前代碼塊有效
}
case THU, FRI -> {
System.out.println("下半周");
String s = "def";
}
case SAT, SUN -> {
System.out.println("周末");
}
}
System.out.println("12");
}
//定義枚舉
enum Weekday{
MON,TUE,WEN,THU,FRI,SAT,SUN
}
運(yùn)行結(jié)果:
上半周
12
2.JDK14中擴(kuò)展了switch可以作為表達(dá)式進(jìn)行賦值或打印操作
public class SwitchTest {
public static void main(String[] args) {
Weekday day = Weekday.MON; //初始化一個(gè)枚舉變量
//JDK14中擴(kuò)展了switch可以作為表達(dá)式
//將表達(dá)式的值打印出來
System.out.println(switch(day){
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN -> "周末";
});
//將表達(dá)式的值賦值給一個(gè)變量
String text = switch(day){
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN -> "周末";
};
//通過yield產(chǎn)生一個(gè)新的值
day = Weekday.SAT;
int x = switch(day){
case MON, TUE, WEN -> 1;
case THU, FRI -> 2;
case SAT, SUN -> {
int rnd = (int)(Math.random()*10); //生成一個(gè)(0,10)內(nèi)的隨機(jī)整數(shù)
System.out.println("rnd = " + rnd);
yield rnd; //通過yield產(chǎn)生一個(gè)新的值
};
};
System.out.println("x = " + x);
}
}
//定義枚舉
enum Weekday{
MON,TUE,WEN,THU,FRI,SAT,SUN
}
總結(jié)
本文介紹了JDK14中的switch新特性。也是唯一正式版本的新特性....
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
到此這篇關(guān)于JDK14新特性之switch表達(dá)式的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JDK14 switch表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 多線程同步 鎖機(jī)制與synchronized深入解析
從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒上鎖房間里的一塊用帶鎖的屏風(fēng)隔開的空間2013-09-09
MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析詳解
這篇文章主要介紹了MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼,非常具有實(shí)用價(jià)值,有興趣的可以了解一下。2017-03-03
Java 如何快速,優(yōu)雅的實(shí)現(xiàn)導(dǎo)出Excel
這篇文章主要介紹了Java 如何快速,優(yōu)雅的實(shí)現(xiàn)導(dǎo)出Excel,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
SpringBoot注冊Filter的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot注冊Filter的兩種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Eclipse配置tomcat發(fā)布路徑的問題wtpwebapps解決辦法
這篇文章主要介紹了Eclipse配置tomcat發(fā)布路徑的問題wtpwebapps解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06
基于java實(shí)現(xiàn)顏色拾色器并打包成exe
這篇文章主要為大家詳細(xì)介紹了如何基于java編寫一個(gè)簡單的顏色拾色器并打包成exe文件,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10

