JDK12-switch匹配
之前Java的模式匹配
- JavaSwitch仅支持单值匹配,只能在switch匹配语句中匹配单一值
- JavaSwitch仅支持int类型匹配,只能基于整型进行相等性判断
- byte/short/char,可以向上转为int类型而不损失精度,所以这三种基本类型可以使用switch进行匹配
- char 取 unicode 整型码值
- String/Enum,作为JDK的内置类型,编译器会分别调用 hashCode()/ordinal()方法产生int结果,从而进行匹配
- 计算并比较 hashcode,如果 hashcode 相同,则进一步使用 equals 确定字符串内容相同,处理两个字符串 hashcode 相同的情况
- byte/short/char,可以向上转为int类型而不损失精度,所以这三种基本类型可以使用switch进行匹配
- break 在字节码层面上会生成一条 goto 语句,case 下不带 break 时直接进入下一个 case 逻辑
JDK12更丰富的模式匹配
- 支持多值匹配
- 支持表达式赋值
- 抽象语法表述
public void jdk12switch() {
Weekday day = Weekday.MON;
// 1. JDK12中扩展了switch可以作为表达式
System.out.println(switch (day) {
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN ->
"""
<html>
<p>周末</p>
</html>
""";
});
// 2. 将表达式的值赋值给一个变量 => to old
String text = switch (day) {
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN -> "周末";
};
System.out.println(text);
// 3. 通过yield产生一个新的值
day = Weekday.SAT;
int x = switch (day) {
case MON, TUE, WEN -> 1;
case THU, FRI -> {
System.out.println();
yield 2;
}
case SAT, SUN -> {
int rnd = (int) (Math.random() * 10);
System.out.println("rnd = " + rnd);
yield rnd;
}
};
System.out.println(x);
}
将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。
Scala现代化的模式匹配
- 计算表达式的匹配(值绑定)
- 区间表达式匹配
- …