Switch 的三个方面,参考: JEP 361
- 支持箭头表达式
- 支持 yied 返回值
- 支持 Java Record
箭头表达式,新的 case 标签
Switch 新的语法,case label -> 表达式|throw 语句|block
case label_1, label_2, ..., label_n -> expression;|throw-statement;|block
step1:新的 case 标签
week:表示周日(1)到周六(7),1 和 7 是休息日,其他是工作日。如果 1-7 以外为无效日期
代码语言:javascript复制@Test
public void test01() {
int week = 7;
String memo = "";//表示计算结果
switch (week){
case 1 -> memo = "星期日,休息";
case 2,3,4,5,6 -> memo = "工作日";
case 7 -> memo ="星期六,休息";
default -> throw new RuntimeException("无效的日期");
}
System.out.println("memo = " memo);
}
yeild 返回值
yeild 让 switch 作为表达式,能够返回值
语法
变量 = switch(value) { case v1: yield 结果值; case v2: yield 结果值;case v3,v4,v5.. yield 结果值 }
示例: yield 返回值,跳出 switch 块
@Test
public void test02() {
int week = 2;
String memo = switch (week){
case 1 :yield "星期日";
case 2,3,4,5,6 :yield "工作日";
case 7 : yield "星期六";
default:yield "无效日期";
};
System.out.println("memo = " memo);
}
无需中间变量, switch 作为表达式计算,可以得到结果。yield 是表达式的返回值
示例: 多表达式, case 与 yield 结合使用
代码语言:javascript复制 @Test
public void test03() {
int week = 3;
String memo = switch (week){
case 1 -> {
System.out.println("星期日,执行了自定义代码");
yield "星期日";
}
case 2,3,4,5,6 -> {
System.out.println("工作日,执行了自定义代码");
yield "2-6工作日";
}
case 7 -> {
System.out.println("星期六,执行了自定义代码");
yield "星期六";
}
default -> {
System.out.println("执行了自定义代码");
yield "其他日期";
}
};
System.out.println("memo = " memo);
}
提示: case 标签-> 与 case 标签:不能混用。 一个 switch 语句块中使用一种语法格式。 switch 作为表达式,赋值给变量,需要 yield 或者 case 标签-> 表达式。->右侧表达式为 case 返回值。
示例:
代码语言:javascript复制public void test(){
int week = 1;
//yield 是 switch 的返回值, yield 跳出当前 switch 块
String memo = switch (week){
case 1 ->{
System.out.println("week=1 的 表达式部分");
yield "星期日,休息";
}
case 2,3,4,5,6 ->{
System.out.println("week=2,3,4,5,6 的 表达式部分");
yield "工作日";
}
case 7 -> "星期六,休息";
default -> "无效日期";
};
System.out.println("week = " memo);
}
}
Java Record
switch 表达式中使用 record,结合 case 标签-> 表达式,yield 实现复杂的计算 step1: 准备三个 Record
代码语言:javascript复制public record Line(int x,int y) {
}
public record Rectangle(int width,int height) {
}
public record Shape(int width,int height) {
}
step2: switch record
代码语言:javascript复制@Test
public void test04() {
//创建对象
Line line = new Line(10,20);
Rectangle rectangle = new Rectangle(20,50);
Shape shape = new Shape(50,80);
Object obj = line;
int result = switch (obj){
case Line(int x,int y) -> {
System.out.println("图形是Line,x:" x ",y:" y);
yield x y;
}
case Rectangle(int w,int h) -> 2*(w h);
case Shape(int x,int y) ->{
System.out.println("图形Shape");
yield x*y;
}
default -> 0;
};
System.out.println("result = " result);
}
case Line , Rectangle,Shape 在代码块执行多条语句,或者箭头->表达式。