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)); } } }
文晓欢欢
2020.03.23