2020 年 3 月份 Java 14 發(fā)布侥锦。
其中有一個有趣的更新:新的 Switch 表達式进栽。
看代碼前,看一下環(huán)境:MacOS恭垦,OpenJDK 14:
讓我們先看一下 Java 中經典的 Switch 語句:
public class SwitchStatementDemo {
enum MyDogs {
Winston, Sprite, Buster, Oscar, Speedy
}
enum Breed {
GoldenRetriever, ShetlandSheepdog, Teddy
}
public static void main(String[] args) {
printBreed(MyDogs.Winston);
printBreed(MyDogs.Oscar);
printBreed(MyDogs.Speedy);
}
static void printBreed(MyDogs dog) {
switch (dog) {
case Winston:
case Sprite:
System.out.printf("%s, breed is %s %n", dog, Breed.GoldenRetriever);
break;
case Buster:
case Oscar:
System.out.printf("%s, breed is %s %n", dog, Breed.ShetlandSheepdog);
break;
case Speedy:
System.out.printf("%s, breed is %s %n", dog, Breed.Teddy);
break;
default:
throw new IllegalArgumentException(
String.format("Unknown breed: %s", dog));
}
}
}
然后快毛,讓我們直接來看一下新的 Switch 表達式:
static void anotherPrintBreed(MyDogs dog) {
String breed = switch (dog) {
case Winston, Sprite -> "GoldenRetriever";
case Buster, Oscar -> "ShetlandSheepdog";
case Speedy -> "Teddy";
};
System.out.printf("%s, breed is %s %n", dog, breed);
}
我們可以看到,新的 Switch 語句將不需要再寫 case 標簽番挺,而是用 -> 代替唠帝。
同時,也可以省略 default 但是此時 case 中需要包含所有可能的輸入值玄柏。
否則襟衰,default 還是必須的:
// 添加多一個 Nono。
enum MyDogs {
Winston, Sprite, Buster, Oscar, Speedy, Nono
}
// 此時case 沒有包括 Nono 的話粪摘,需要添加 default 語句
static void anotherPrintBreed(MyDogs dog) {
String breed = switch (dog) {
case Winston, Sprite -> "GoldenRetriever";
case Buster, Oscar -> "ShetlandSheepdog";
case Speedy -> "Teddy";
default -> "default";
};
System.out.printf("%s, breed is %s %n", dog, breed);
}
使用 default瀑晒, 我們還可以通過花括號添加額外的信息:
static void anotherPrintBreed(MyDogs dog) {
String breed = switch (dog) {
case Winston, Sprite -> "GoldenRetriever";
case Buster, Oscar -> "ShetlandSheepdog";
case Speedy -> "Teddy";
default -> {
System.out.println("default語句被執(zhí)行了。");
yield "default";
}
};
System.out.printf("%s, breed is %s %n", dog, breed);
}
default 語句必須給一個值赶熟,我們需要使用 yield 關鍵字來設置默認值瑰妄。
以下是最終的代碼例子:
public class SwitchStatementDemo {
enum MyDogs {
Winston, Sprite, Buster, Oscar, Speedy, Nono
}
enum Breed {
GoldenRetriever, ShetlandSheepdog, Teddy
}
public static void main(String[] args) {
// printBreed(MyDogs.Winston);
// printBreed(MyDogs.Oscar);
// printBreed(MyDogs.Speedy);
anotherPrintBreed(MyDogs.Winston);
anotherPrintBreed(MyDogs.Oscar);
anotherPrintBreed(MyDogs.Speedy);
anotherPrintBreed(MyDogs.Nono);
}
static void anotherPrintBreed(MyDogs dog) {
String breed = switch (dog) {
case Winston, Sprite -> "GoldenRetriever";
case Buster, Oscar -> "ShetlandSheepdog";
case Speedy -> "Teddy";
default -> {
System.out.println("default語句被執(zhí)行了陷嘴。");
yield "default";
}
};
System.out.printf("%s, breed is %s %n", dog, breed);
}
static void printBreed(MyDogs dog) {
switch (dog) {
case Winston:
case Sprite:
System.out.printf("%s, breed is %s %n", dog, Breed.GoldenRetriever);
break;
case Buster:
case Oscar:
System.out.printf("%s, breed is %s %n", dog, Breed.ShetlandSheepdog);
break;
case Speedy:
System.out.printf("%s, breed is %s %n", dog, Breed.Teddy);
break;
default:
throw new IllegalArgumentException(
String.format("Unknown breed: %s", dog));
}
}
}
文曉歡歡
2020.03.23