提到 switch, 所有 Java 开发人员应该都不陌生。switch 根据变量的值来执行不同的逻辑,用来替代多分支的if/else

不过 switch 语句在使用时存在一些常见问题。

首先是 switch 语句中的 case 分支的执行,默认是往下进行的,需要添加 break 来跳出 switch 的执行。这种行为很容易产生bug。

比如,下面代码中的 trafficControl 方法,在参数值是 RED 时,会执行全部的 case 分支,因为并没有添加 break 语句。

public class SwitchStatement {enum TrafficColor {RED, YELLOW, GREEN}public void trafficControl(TrafficColor color) {switch (color) {case RED:this.stop();case GREEN:this.go();default:this.watchOut();}}private void go() {System.out.println("Go!");}private void stop() {System.out.println("Stop!");}private void watchOut() {System.out.println("Be careful!");}
}

switch 语句的另外一个常见用法是在不同的分支中对同一个变量进行赋值。如下面的代码所示。这种写法比较繁琐。

public class SwitchStatementAssignment {enum TrafficColor {RED, YELLOW, GREEN}public String getMessage(TrafficColor color) {String message;switch (color) {case RED:message = "Stop!";break;case GREEN:message = "Go!";break;default:message = "Be careful!";}return message;}
}

为了解决这两个问题,可以用到 switch 表达式和箭头标签。

switch 表达式在 Java 12 中以预览功能的形式引入,在 Java 13 中再次预览,在 Java 14 中成为正式功能。

switch 可以作为表达式来使用,因此可以有自己的值。这就简化了赋值操作。switch 表达式的值由分支来确定。下面的代码展示了 switch 表达式的基本用法。

public class SwitchExpression {public String formatGifts(int number) {return switch (number) {case 0 -> "no gifts";case 1 -> "only one gift";default -> number + " gifts";};}
}

在上述代码中,switch 表达式使用的不是传统的冒号,而是箭头。在使用了箭头之后,代码执行不会转到下一个分支,相当于添加了 break。在下面的代码中,同样的 trafficControl 方法,使用箭头标签之后,就不再需要使用 break

public class SwitchLabel {enum TrafficColor {RED, YELLOW, GREEN}public void trafficControl(TrafficColor color) {switch (color) {case RED -> System.out.println("Stop!");case YELLOW -> System.out.println("Be careful!");case GREEN -> System.out.println("Go!");}}
}

大多数情况下,箭头标签之后使用单个表达式就可以满足需求。如果有复杂的逻辑,可以使用代码块。这个时候就需要用 yield 来提供值。

public class YieldValue {public String formatGifts(int number) {return switch (number) {case 0 -> "no gifts";case 1 -> "only one gift";default -> {if (number < 0) {yield "no gifts";} else {yield number + " gifts";}}};}
}

在使用传统标签的 switch 语句中,也是可以使用 yield

public class YieldValue2 {public String formatGifts(int number) {return switch (number) {case 0:yield "no gifts";case 1:yield "only one gift";default: {if (number < 0) {yield "no gifts";} else {yield number + " gifts";}}};}
}

关于 switch 表达式的内容,就介绍到这里。相应的视频见我的B站。


推一下我的新书《Quarkus云原生微服务开发实战》,京东淘宝搜索书名即可。

【升级到Java 17】switch 表达式相关推荐

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

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

  2. Spring Framework 6 将采用 Java 17,是时候将你的应用升级了

    关于从先前的长期支持版本(Java 11 和 Java 8)迁移代码,你需要知道的是什么? 整理 | 王晓曼 出品 | CSDN(ID:CSDNnews) Spring Framework 6 将采用 ...

  3. 通过引入switch表达式来增强Java switch语句

    去年12月下旬,我发布了" Switch Expressions Coming Java? 从那时起,进行了广泛的讨论,表达了意见分歧,现在就Java的switch表达式的未来达成了共识. ...

  4. Java 9~Java 17主要更新了什么?

    James Gosling:对继续坚守 Java8 的朋友,我想说"是时候作出改变了".新系统全方位性更强.速度更快.错误也更少.扩展效率更高.无论从哪个角度看,大家都有理由接纳 ...

  5. 从 java 8 到 java 17

    Jdk17发布已经一年多了,java 8 实在是太老了,最近项目上准备从java 8 升级到 java 17. 本文整理和记录了部分 个人认为常用的新特性.以做记录和参考,如有不准确的地方,请大家指正 ...

  6. 【JDK】win 10 / win 11:jdk 8 升级为 jdk 17

    目录 一.前言 二.历史版本 Java 安装 三.最新版本 Java 安装 (1)历史版本作废 (2)最新版本沿用旧版 JDK 系统环境变量 (3)JDK 17 下载 (4)JDK 17 安装 (5) ...

  7. 现在是时候将应用程序迁移到Java 17了?

    原文作者:Johan Janssen,原文链接:It's time to move your applications to Java 17. Here's why-and how. 关于从以前的长期 ...

  8. wsl 或者window terminal 下出现Java 14 switch expressions unrecognized解决方法:升级java jdk到14 or later

    文章目录 缘由 解决方法 参考 缘由 IDEA中build成功,但是automated build失败 $ ./gradlew> Task :compileJava FAILED Wordle/ ...

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

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

  10. java switch语句与switch表达式区别及使用

    1.switch语句 与if/else语句不同,switch语句可以有许多可能的执行路径.switch可用于基本类型byte.short.char和int.它们各自的包装类型(byte.short.C ...

最新文章

  1. R主成分分析PCA示例
  2. 微软宣布MySQL和PostgreSQL的Azure数据库服务正式可用
  3. 追根究底之以不变求万变:利用SetCapture捕获鼠标
  4. 为啥我的Python这么慢 - 项查找 (二)
  5. 7-1 顶点的度 (15 分)
  6. 没有基础怎么学习Web前端?相关学习路线又是什么?
  7. 如何快速制作短视频?拥有这个神器,轻松搞定!
  8. 中国移动java项目_Java Web开发-项目部分(中国移动科技综合管理系统)视频——私塾在线提供...
  9. Smart210使用superboot刷机
  10. 大数据第一季--java基础(day5)-徐培成-专题视频课程
  11. .net 访问共享文件夹
  12. rest api解决url参数中带点的问题,REST正则匹配
  13. 使用BootStrap.编写网页
  14. 无线网卡安装后显示无服务器,USB无线网卡安装后连接图标不显示怎么办【解决方法】...
  15. 【联机对战】一张图看懂联机对战服务
  16. PS3视频媒体播放基本说明
  17. 使用VirtualBox创建虚拟机
  18. Ubuntu20 设置桌面壁纸自动切换
  19. layui弄一个好看的数据表格样式
  20. 命名实体识别(二)——基于条件随机场的命名实体识别

热门文章

  1. oralce分析函数---group by || rollup || cude || grouping || grouping sets
  2. linux添加静态ipv6路由,请问如何在CentOS7上配置已经静态路由好的IPv6地址块?
  3. gitlab CI CD
  4. Foobar2000 CUI界面foobox开发已经接近尾声
  5. 保留两位小数除法算式_小数除法计算题
  6. 细心整理近50个ARM开发相关的网站和学习资料
  7. 多元统计分析--判别(距离判别、Fisher判别、Bayes判别)
  8. 机器学习算法工程师也会遇到35岁这道坎么?
  9. 12、添加和删除页码符号
  10. 微信商户平台所有产品总结