这是我参与「第五届青训营 」伴学笔记创作活动的第 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后面只能跟随字面量来使用,不可以是变量
注意点:
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; }
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"); } -
// 类型上的模式匹配 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 循环
-
对于
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); -
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直接控制外层的循环,跳出了这个嵌套循环。