JDK13 Switch表达式新特性
先定义一个枚举类,方便后面 Demo演示。
public enum StatusEnum {STATUS_1("状态1"),STATUS_2("状态2"),STATUS_3("状态3"),STATUS_4("状态4"),STATUS_5("状态5"),;private String message;StatusEnum(String message) {this.message = message;}
}
一、JDK12 以前的特性
JDK12(不包含)以前的 switch是的写法:
private static void jdk12Pre() {StatusEnum statusEnum = StatusEnum.STATUS_2;switch (statusEnum) {case STATUS_1:System.out.println("1:" + statusEnum.name());break;case STATUS_2:System.out.println("2:" + statusEnum.name());case STATUS_3:System.out.println("3:" + statusEnum.name());break;case STATUS_4:System.out.println("4:" + statusEnum.name());break;default:System.out.println("other");}}
上面代码中多处出现 break 语句,显得代码比较冗余,同时如果某处漏写一段 break 语句,将导致程序一直向下穿透执行的逻辑错误,出现异常结果,同时这种写法比较繁琐,也容易出问题。
Java 12之前版本中,switch 表达式支持下面类型: byte、char、short、int、Byte、Character、Short、Integer、enum、String。
二、JDK12新特性
switch表达式新特性:
- 可以使用
->
操作符,默认会在后面自动添加 break。 - switch表达式拥有返回值。
1、->箭头操作符
在JDK12中 switch可以这样写:
private static void jdk12_1() {StatusEnum statusEnum = StatusEnum.STATUS_5;switch (statusEnum) {case STATUS_1 -> System.out.println("1:" + statusEnum.name());case STATUS_2, STATUS_3 -> {System.out.println("2:" + statusEnum.name());System.out.println("3:" + statusEnum.name());}case STATUS_4 -> {System.out.println("4:" + statusEnum.name());}default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());}}
可以看出 JDK12中 switch的代码更清晰,更简洁。
注意:
- 新语法使用
->
操作符,如果有多条语句,需要用 {}括起来。 - 不需要写 break语句,因为新语法只会执行匹配的语句,没有穿透效应。
2、switch拥有返回值
switch拥有返回值,我们可以返回一个简单的值。
private static void jdk12_2() {StatusEnum statusEnum = StatusEnum.STATUS_3;int returnValue = switch(statusEnum) {case STATUS_1 -> 4;case STATUS_2, STATUS_3 -> 5;case STATUS_4 -> 6;default -> throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());};System.out.println(returnValue);}
三、JDK13新特性
JDK13中对 switch进一步改进,利用关键字 yield
可以对多态语句中将值返回,相当于函数的 return。
使用箭头表达式,如果右边的语句是多条语句,则用{}括起来,然后对于返回值,则通过关键字yield
进行返回。
private static void jdk13() {StatusEnum statusEnum = StatusEnum.STATUS_4;String name = switch (statusEnum) {case STATUS_1 -> statusEnum.name();case STATUS_2, STATUS_3 -> {System.out.println("2:" + statusEnum.name());System.out.println("3:" + statusEnum.name());yield statusEnum.name() + statusEnum.ordinal();}case STATUS_4 -> {System.out.println("4:" + statusEnum.name());yield statusEnum.name() + statusEnum.ordinal();}default -> {throw new RuntimeException("没有这个枚举值的处理, statusEnum=" + statusEnum.name());// yield null;}}; // 注意赋值语句要以;结束System.out.println("name=" + name);}
注意:
赋值语句要以 ;结束。
– 求知若饥,虚心若愚。
JDK13 Switch表达式新特性相关推荐
- Java 12 switch表达式新特性(->,yield)
switch表达式 使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误.从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pa ...
- switch表达式新语法
1.JDK12之前的原语法 public static void choiceSwitch(int num) { switch (num) {case 1:System.out.println(&q ...
- JDK9-17开发常用的新特性
以下样例代码均可在样例代码中查看 jdk9新特性 新功能和库的更新 "_"为关键字,不可作为变量名 As of Java 9, '_' is a keyword, and may ...
- JDK 14的新特性:switch表达式
文章目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JE ...
- Java15来了!!!一文详解JDK15新特性
读懂JDK15新特性,这一篇就够了 一.Java历史简谈 二.我们该如何学习Java新特性 三.Java15新特性详解 特性一:密封类(语法层面) 特性二:instanceof 自动匹配模式(语法层面 ...
- JDK9-17新特性
文章目录 环境准备 JAVA9 概述 一 语法层次的改变 1_钻石操作符号语法升级 2_try结构语法升级 3_下划线命名标识符的使用限制 二 API层次的改变 1_接口中的私有方法 2_String ...
- 浅谈java15新特性
你发任你发,我用Java8. jdk15的安装和新版idea的安装就不说了,下面奉上两个软件. 链接: https://pan.baidu.com/s/1hOb0CChSfYotFl3s3QL2yA ...
- java switch 表达式_尝鲜Java 12新特性:switch表达式
Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP.其中对Java语法的改进是JEP 325: switch表达式.于是我迫不及待,提前感受一下更先进的语言 ...
- JDK13的六大重要新特性
文章目录 JDK13的六大重要特性 支持Unicode 12.1 动态CDS归档(Dynamic CDS Archiving) java.net.Socket和java.net.ServerSocke ...
- jdk9、jdk10、jdk11、jdk12、jdk13新特性
我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特 ...
最新文章
- 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
- ARKit从入门到精通(11)-ARKit开发常见问题及解决方案
- Windows Phone 7 软件体系结构
- 51nod1649齐头并进-Dijkstra
- html高德地图无法显示,关于高德地图不显示的问题
- OA流程 工作流设计
- 华为笔记本键盘说明图_没有键盘的笔记本:华为 MateBook上手图赏
- Python实现绘制函数图像——以Sigmoid函数为例
- 3D目标检测-BEVFormer、BEVDepth
- CToolBar的使用总结1
- 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?
- 市场经济下的“按劳分配”
- 【图解】PCB快速制板,热转印机+腐蚀槽
- 基于拉普拉斯金字塔的图像融合算法
- Android插件化开发之动态加载本地皮肤包进行换肤
- oracle 导出数据expdp的query参数用法
- 麦肯锡7个步骤解决问题
- parsefloat(). Php,JavaScript ParseFloat()方法
- 插件79:搜索Google图书
- 我的前端自学之路 JavaScript面向对象