JEP 361: Switch Expressions (Standard)
引入
扩展switch分支选择语句的写法。Switch表达式在经过JDK 12 和JDK13的预览之后,在JDK 14中已经稳定可用。
设计初衷
Java的switch语句是一个变化较大的语法(可能是因为Java的switch语句一直不够强大、熟悉swift或者js语言的同学可与swift的switch语句对比一下,就会发现Java的switch相对较弱),因为Java的很多版本都在不断地改进switch语句:JDK 12扩展了switch语句,使其可以用作语句或者表达式,并且传统的和扩展的简化版switch都可以使用。
JDK 12对于switch的增强主要在于简化书写形式,提升功能点。 下面简单回顾一下switch的进化阶段:
-
从Java 5+开始,Java的switch语句可使用枚举了。
-
从Java 7+开始,Java的switch语句支持使用String类型的变量和表达式了。
-
从Java 11+开始,Java的switch语句会自动对省略break导致的贯穿提示警告。
-
但从JDK12开始,Java的switch语句有了很大程度的增强。
-
JDK 14的该JEP是从JEP 325和JEP 354演变而来的。但是,此JEP 361 Switch表达式 (标准)是独立的,并且不依赖于这两个JEP。
以前的switch程序
JDK 14不需要break了
在JDK 12之前如果switch忘记写break将导致贯穿,在JDK 12对switch的这一贯穿性做了改进。你只要将case后面的冒号(:)改成箭头,那么你即使不写break也不会贯穿了,因此上面程序可改写如下形式:
上面代码简洁很多了。
JDK 14的switch表达式
JDK 12之后的switch甚至可作为表达式了——不再是单独的语句。例如如下程序。
上面程序直接将switch表达式的值赋值给s变量,这样switch不再是一个语句,而是一个表达式.
JDK 14中switch的多值匹配
当你把switch中的case后的冒号改为箭头之后,此时switch就不会贯穿了,但在某些情况下,程序本来就希望贯穿比如我就希望两个case共用一个执行体!JDK 12之后的switch中的case也支持多值匹配,这样程序就变得更加简洁了。例如如下程序。
JDK 14的Yielding a value
当使用箭头标签时,箭头标签右边可以是表达式、throw
语句或是代码块。如果是代码块,需要使用yield
语句来返回值。下面代码中的print方法中的default
语句的右边是一个代码块。在代码块中使用yield
来返回值。,JDK 14引入了一个新的yield
语句来产生一个值,该值成为封闭的switch表达式的值