意思就是 switch 中的 case 条件没有完全覆盖枚举中可能存在的值。好吧,那就把 PINGPANG 的条件加上吧。来看一下完整的代码:
public class OldSwitchDemo {public enum PlayerTypes {
TENNIS,
FOOTBALL,
BASKETBALL,
PINGPANG,
UNKNOWN
}
public static void main(String[] args) {
System.out.println(createPlayer(PlayerTypes.BASKETBALL));
}
private static String createPlayer(PlayerTypes playerType) {
return switch (playerType) {
case TENNIS -> "网球运动员费德勒";
case FOOTBALL -> "足球运动员C罗";
case BASKETBALL -> "篮球运动员詹姆斯";
case PINGPANG -> "乒乓球运动员马龙";
case UNKNOWN -> throw new IllegalArgumentException("未知");
};
}
}
switch 语句变成了强大的 switch 表达式,美滋滋啊!那假如一个运动员既会打篮球又会打乒乓球呢?
private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {
case TENNIS -> "网球运动员费德勒";
case FOOTBALL -> "足球运动员C罗";
case BASKETBALL,PINGPANG -> "牛逼运动员沉默王二";
case UNKNOWN -> throw new IllegalArgumentException("未知");
};
}
就像上述代码那样,使用英文逗号“,”把条件分割开就行了,666 啊!
不服气?switch 表达式还有更厉害的,-> 右侧还可以是 {} 括起来的代码块,就像 Lambda 表达式那样。
private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {
case TENNIS -> {
System.out.println("网球");
yield "网球运动员费德勒";
}
case FOOTBALL -> {
System.out.println("足球");
yield "足球运动员C罗";
}
case BASKETBALL -> {
System.out.println("篮球");
yield "篮球运动员詹姆斯";
}
case PINGPANG -> {
System.out.println("乒乓球");
yield "乒乓球运动员马龙";
}
case UNKNOWN -> throw new IllegalArgumentException("未知");
};
}
细心的同学会发现一个之前素未谋面的关键字 yield,它和传统的 return、break 有什么区别呢?
先来看官方的解释:
A yield statement transfers control by causing an enclosing switch expression to produce a specified value.
意思就是说 yield 语句通过使一个封闭的 switch 表达式产生一个指定值来转移控制权。为了进一步地了解 yield 关键字,我们可以反编译一下字节码:
private static String createPlayer(NewSwitchDemo3.PlayerTypes playerType) {String var10000;
switch(playerType) {
case TENNIS:
System.out.println("网球");
var10000 = "网球运动员费德勒";
break;
case FOOTBALL:
System.out.println("足球");
var10000 = "足球运动员C罗";
break;
case BASKETBALL:
System.out.println("篮球");
var10000 = "篮球运动员詹姆斯";
break;
case PINGPANG:
System.out.println("乒乓球");
var10000 = "乒乓球运动员马龙";
break;
case UNKNOWN:
throw new IllegalArgumentException("未知");
default:
throw new IncompatibleClassChangeError();
}
return var10000;
}