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
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦