2020 年 3 月份 Java 14 发布。
其中有一个有趣的更新:新的 Switch 表达式。
让我们花 1 分钟了解 Java 中新的 Switch 表达式
2020 年 3 月份 Java 14 发布。
其中有一个有趣的更新:新的 Switch 表达式。
看代码前,看一下环境: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语句被执行了。"); 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语句被执行了。"); 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)); } }}
阅读全文: http://gitbook.cn/gitchat/activity/5e7ad96c0dc47979b94b2cce
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。