JDK有用的新特性-Switch

2023-10-16 15:52:07 浏览数 (2)

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 块

代码语言:javascript复制
@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 在代码块执行多条语句,或者箭头->表达式。

0 人点赞