先定义一个枚举类,方便后面 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表达式新特性相关推荐

  1. Java 12 switch表达式新特性(->,yield)

    switch表达式 使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误.从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pa ...

  2. switch表达式新语法

    1.JDK12之前的原语法  public static void choiceSwitch(int num) { switch (num) {case 1:System.out.println(&q ...

  3. JDK9-17开发常用的新特性

    以下样例代码均可在样例代码中查看 jdk9新特性 新功能和库的更新 "_"为关键字,不可作为变量名 As of Java 9, '_' is a keyword, and may ...

  4. JDK 14的新特性:switch表达式

    文章目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JE ...

  5. Java15来了!!!一文详解JDK15新特性

    读懂JDK15新特性,这一篇就够了 一.Java历史简谈 二.我们该如何学习Java新特性 三.Java15新特性详解 特性一:密封类(语法层面) 特性二:instanceof 自动匹配模式(语法层面 ...

  6. JDK9-17新特性

    文章目录 环境准备 JAVA9 概述 一 语法层次的改变 1_钻石操作符号语法升级 2_try结构语法升级 3_下划线命名标识符的使用限制 二 API层次的改变 1_接口中的私有方法 2_String ...

  7. 浅谈java15新特性

    你发任你发,我用Java8.  jdk15的安装和新版idea的安装就不说了,下面奉上两个软件. 链接: https://pan.baidu.com/s/1hOb0CChSfYotFl3s3QL2yA ...

  8. java switch 表达式_尝鲜Java 12新特性:switch表达式

    Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP.其中对Java语法的改进是JEP 325: switch表达式.于是我迫不及待,提前感受一下更先进的语言 ...

  9. JDK13的六大重要新特性

    文章目录 JDK13的六大重要特性 支持Unicode 12.1 动态CDS归档(Dynamic CDS Archiving) java.net.Socket和java.net.ServerSocke ...

  10. jdk9、jdk10、jdk11、jdk12、jdk13新特性

    我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特 ...

最新文章

  1. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  2. ARKit从入门到精通(11)-ARKit开发常见问题及解决方案
  3. Windows Phone 7 软件体系结构
  4. 51nod1649齐头并进-Dijkstra
  5. html高德地图无法显示,关于高德地图不显示的问题
  6. OA流程 工作流设计
  7. 华为笔记本键盘说明图_没有键盘的笔记本:华为 MateBook上手图赏
  8. Python实现绘制函数图像——以Sigmoid函数为例
  9. 3D目标检测-BEVFormer、BEVDepth
  10. CToolBar的使用总结1
  11. 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?
  12. 市场经济下的“按劳分配”
  13. 【图解】PCB快速制板,热转印机+腐蚀槽
  14. 基于拉普拉斯金字塔的图像融合算法
  15. Android插件化开发之动态加载本地皮肤包进行换肤
  16. oracle 导出数据expdp的query参数用法
  17. 麦肯锡7个步骤解决问题
  18. parsefloat(). Php,JavaScript ParseFloat()方法
  19. 插件79:搜索Google图书
  20. 我的前端自学之路 JavaScript面向对象

热门文章

  1. cmake编译so库
  2. 【人机交互技术】工具软件界面设计
  3. 一款软件界面的重要性
  4. 电脑开机内存占用过高处理
  5. [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  6. TreeUtil(树形结构转换)
  7. 移动端web设计尺寸_移动端之Web及app设计尺寸
  8. c语言静态变量的特点,静态变量有什么特点
  9. 迅雷下载Linux Oracle11gR2和Oracle12c
  10. 全球及中国生物制药产业盈利现状及竞争格局展望报告2021-2027年