JDK有用的新特性-Switch


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 以外为无效日期

@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 结合使用

 @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 返回值。

示例:

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

public record Line(int x,int y) {
}
public record Rectangle(int width,int height) {
}
public record Shape(int width,int height) {
}

step2: switch record

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

公众号本文地址:https://mp.weixin.qq.com/s/TncbVznOSbVIShEQxOny8w
欢迎关注公众号:愚生浅末。


推荐阅读

  1. JDK有用的新特性-Java Record

  2. 严蔚敏 数据结构 配套教材 PDF

  3. 四款AI辅助工具,太强了...

posted @ 2023-07-16 10:23  愚生浅末  阅读(121)  评论(0编辑  收藏  举报