起因是什么我懒得复制了,大致就是在IDEA中去写一个练习的时候无意当中摁了Tab键,从switch中迸发出了"->"这个符号,所以有了想要总结一下的想法
1.传统的switch语句
switch(choice){
case 1:
searchBook();
break;//必须手动添加break
case 2:
addBook();
break;
case 3:
deleteBook();
break;
default:
System.out.println("无效的选择,请重试");
break;
}
繁琐的break:每一个case后面几乎都要跟着一个break
Fall-through:如果你忘记写了break,程序会继续执行下一个case的代码,这通常不是我们想要的结果,虽然大概率不会出现,但是代码的鲁棒性还是需要被考虑的
代码冗长且不美观
Enhanced Switch的出现
package demo2;
import java.util.Scanner;
public class Test {
public static void searchBook(){
}
public static void addBook(){
}
public static void deleteBook(){
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
switch(choice){
case 1 -> searchBook();
case 2 -> addBook();
case 3 -> deleteBook();
default -> System.out.println("无效的选择,请重试");4
}
}
}
不再需要break,箭头右边的代码执行完毕后,switch就会自动结束,这从根本上独具了因为忘记break而导致的“贯穿”错误
代码更简洁,代码行数减少,逻辑一目了然,可读性大大增强
并且此时支持多个case标签:
case 1,2,3 -> handleBookOperations();
十分方便,并且值得一提的一点是,旧版的switch是一个语句,但是新版被加强之后的switch可以是一个表达式,也就是可以有返回值
看一个例子就明白了:
假设我们要根据用户冬季("GOLD","SILVER","BRONZE")计算折扣率
传统写法:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double discount;
String level = scanner.nextLine();
switch(level){
case "GOLD":
discount = 0.8;
break;
case "SILVER":
discount = 0.9;
break;
case "BRONZE":
discount = 0.95;
break;
default:
discount = 1.0;
break;
}
//后续使用discount...
}
而如果我们使用新版switch表达式的话,我们就可以这么书写:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String level = scanner.nextLine();
double discount = switch(level){
case "GOLD" -> 0.8;
case "SILVER" -> 0.9;
case "BRONZE" -> 0.95;
default -> 1.0;
};
//后续使用discount...
}
看到了吗?没有if-else的繁杂,也没有旧版switch的break来break去的
这个语句完全可以使用在写Java源码中,十分方便
但是如果说case里面的逻辑很复杂,那么还能不能有替代if-else的可能性了呢?
如果说本身仅仅是switch里面的值和case里面的值的比较配对,我觉得switch完全可以替代if-else
但是如果逻辑繁杂,比如布尔表达式等等等等,那我还是觉得不如还是用if-else
如果箭头右边不止一行代码我们可以用{}来抱起来,并使用yield返回出去一个值给level,这就保证了在赋值的时候可以有其他的操作,例如打印日志等等....
:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String level = scanner.nextLine();
double discount = switch(level){
case "GOLD" -> {
System.out.println("I want a log here!");
yield 0.8;
}//此时这里没有了";"!
case "SILVER" -> 0.9;
case "BRONZE" -> 0.95;
default -> 1.0;
};
//后续使用discount...
}
关键词yield是专门为了switch设计的,用于从一个代码块返回值

1347

被折叠的 条评论
为什么被折叠?



