现在的Java版本号刷的和Chrome一样快,在最新的14版本中加入了switch表达式,和以前使用的switch语句不同,switch表达式带来的不仅仅是编码上的流畅,同时精简了switch语句的使用方式,并且是兼容以前的switch语句。
以前的switch语句在分支结束的时候往往需要我们手动的进行break,否则switch会一直进行下去直到switch语句结束,这很容易造成一些难以排查的bug。switch语句使用冒号来作为分支代码块的的开始,而switch表达式提供了新的流程切换方式:->
符号右边的代码执行完成之后会自动结束整个switch语句。->
右边可以是表达式,代码块或是抛出异常。
由于变成了表达式,现在switch可以用来进行赋值,比如:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
虽然switch表达式的出现在一些流程分支上简化了不少编码,但是需要注意以下几点:
- 使用时必须要覆盖到所有可能的case分支(包括default);
- 每个分支都必须要yield一个值或者抛出异常;
- switch表达式无法使用break,return,continue来跳出;
枚举在使用switch表达式的时候只需要覆盖到所有的枚举值即可,默认的default分支编译期会自动处理加入到表达式中。
上面的要点提到了 yield
,它并不是一个关键字,和 var
一样,都是被严格限制了的类型名。yield
可理解为让,或者是返回。
yield语句
上面的switch表达式是比较简单的yield语句,看下面的代码:
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
因为switch表达式是兼容以前的switch语句,所以也可以这么写:
int result = switch (s) {
case "Foo":
yield 1;
case "Bar":
yield 2;
default:
System.out.println("Neither Foo nor Bar, hmmm...");
yield 0;
};
查看使用switch表达式和switch语句所得到的class文件,发现基本一样,说明switch表达式的实现仍然是Java的语法糖,都是编译器在编译的时候进行处理的。
switch表达式的出现可以看到Java在提高使用者编码效率上还是在不停的努力,期待可以看到更多的新特性来提升编码效率和体验。