流程控制你需要知道的一些技巧 | 青训营笔记

42 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

流程控制

if 和 模式匹配

if 模式匹配在后续的版本中增强,可以使用下面的格式来完成指定类型的匹配,并且完成变量的声明和赋值。

// Old code
if (o instanceof String) {
    String s = (String)o;
    ... use s ...
}
​
// New code
if (o instanceof String s) {
    ... use s ...
}

switch 和 模式匹配

switch传统用法:

  • switch - case - default 每个 case 完成之后就可以使用 break 跳出。
  • switch 支持的类型:byte、short、int、char、枚举(JDK 5)、String(JDK 7)。
  • case后面只能跟随字面量来使用,不可以是变量

注意点:

  1. case 穿透:如果case被匹配到,但是没有break,那么就会执行下一个case的语句,直到break或者遇到大括号为止。可以利用这个技巧简化编程。

    switch(goodsStatus) {
        case Status.ON_SHELF:
            this.status = Status.OFF_SHELF;
            break;
        // 下面代码 下架 和 已删除 状态的操作都是一致的
        // 可以利用这个特性简化代码的编写
        case Status.OFF_SHELF:
        case Status.DELETED:
            throw new IllegalGoodsStatusException();
            break;
    }
    
    1. default 的位置和省略:default并不是必须的,可以省略。default的位置可以在任意位置,甚至可以放在 switch 语句的最前面,但是这样并不会影响它的功能。

switch在后续版本出现了更新:

  • Java 14:对 switch 语法进行了更新

    switch(flag) {
      case 1  -> log.info("didispace.com: 1");
      case 2  -> log.info("didispace.com: 2");
      case 3  -> log.info("didispace.com: 3");
      case 4  -> log.info("didispace.com: 4");
      default -> log.info("didispace.com: x");
    }
    
  • Java 19:switch 模式匹配

    // 类型上的模式匹配
    switch (data.get("key1")) {
      case String s  -> log.info(s);
      case Double d  -> log.info(d.toString());
      case Integer i -> log.info(i.toString());
      default        -> log.info("");
    }
    ​
    // 另一个模式匹配的例子
    Integer i = ...
    switch (i) {
        case -1, 1 -> ...                 // Special cases
        case Integer i when i > 0 -> ...  // Positive integer cases
        case Integer i -> ...             // All the remaining integers
    }
    

for 循环

  1. 对于 for 循环:外小内大

    // 外小内大
    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 10_000; j++)
            sout("i=" + i + ", j=" + j);
    // [!性能差] 外大内小
    for (int i = 0; i < 10_000; i++)
        for (int j = 0; j < 1000; j++)
            sout("i=" + i + ", j=" + j);
    
  2. for 循环指定标签,通过标签控制循环

    outer:
    for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 1000; j++) {
            sout(i + ", " + j + ": break the loop");
            break outer;
        }
        sout("这里不会被执行");
    }
    

    上面的 break 直接控制外层的循环,跳出了这个嵌套循环。