先定义一个枚举类,方便后面 Demo演示。
public enum StatusEnum {
STATUS_1("状态1"),
STATUS_2("状态2"),
STATUS_3("状态3"),
STATUS_4("状态4"),
STATUS_5("状态5"),
;
private String message;
StatusEnum(String message) {
this.message = message;
}
}
一、JDK12 以前的特性
JDK12(不包含)以前的 switch是的写法:
private static void jdk12Pre() {
StatusEnum statusEnum = StatusEnum.STATUS_2;
switch (statusEnum) {
case STATUS_1:
System.out.println("1:" + statusEnum.name());
break;
case STATUS_2:
System.out.println("2:" + statusEnum.name());
case STATUS_3:
System.out.println("3:" + statusEnum.name());
break;
case STATUS_4:
System.out.println("4:" + statusEnum.name());
break;
default:
System.out.println("other");
}
}
上面代码中多处出现 break 语句,显得代码比较冗余,同时如果某处漏写一段 break 语句,将导致程序一直向下穿透执行的逻辑错误,出现异常结果,同时这种写法比较繁琐,也容易出问题。
Java 12之前版本中,switch 表达式支持下面类型: byte、char、short、int、Byte、Character、Short、Integer、enum、String。
二、JDK12新特性switch表达式新特性:
- 可以使用
->
操作符,默认会在后面自动添加 break。 - switch表达式拥有返回值。
在JDK12中 switch可以这样写:
private static void jdk12_1() {
StatusEnum statusEnum = StatusEnum.STATUS_5;
switch (statusEnum) {
case STATUS_1 -> System.out.println("1:" + statusEnum.name());
case STATUS_2, STATUS_3 -> {
System.out.println("2:" + statusEnum.name());
System.out.println("3:" + statusEnum.name());
}
case STATUS_4 -> {
System.out.println("4:" + statusEnum.name());
}
default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
}
}
可以看出 JDK12中 switch的代码更清晰,更简洁。
注意:
- 新语法使用
->
操作符,如果有多条语句,需要用 {}括起来。 - 不需要写 break语句,因为新语法只会执行匹配的语句,没有穿透效应。
switch拥有返回值,我们可以返回一个简单的值。
private static void jdk12_2() {
StatusEnum statusEnum = StatusEnum.STATUS_3;
int returnValue = switch(statusEnum) {
case STATUS_1 -> 4;
case STATUS_2, STATUS_3 -> 5;
case STATUS_4 -> 6;
default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
};
System.out.println(returnValue);
}
三、JDK13新特性
JDK13中对 switch进一步改进,利用关键字 yield
可以对多态语句中将值返回,相当于函数的 return。
使用箭头表达式,如果右边的语句是多条语句,则用{}括起来,然后对于返回值,则通过关键字yield
进行返回。
private static void jdk13() {
StatusEnum statusEnum = StatusEnum.STATUS_4;
String name = switch (statusEnum) {
case STATUS_1 -> statusEnum.name();
case STATUS_2, STATUS_3 -> {
System.out.println("2:" + statusEnum.name());
System.out.println("3:" + statusEnum.name());
yield statusEnum.name() + statusEnum.ordinal();
}
case STATUS_4 -> {
System.out.println("4:" + statusEnum.name());
yield statusEnum.name() + statusEnum.ordinal();
}
default -> {
throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());
// yield null;
}
}; // 注意赋值语句要以;结束
System.out.println("name=" + name);
}
注意:
赋值语句要以 ;结束。
– 求知若饥,虚心若愚。