【升级到Java 17】switch 表达式
提到 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 表达式相关推荐
- Java 12 switch表达式新特性(->,yield)
switch表达式 使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误.从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pa ...
- Spring Framework 6 将采用 Java 17,是时候将你的应用升级了
关于从先前的长期支持版本(Java 11 和 Java 8)迁移代码,你需要知道的是什么? 整理 | 王晓曼 出品 | CSDN(ID:CSDNnews) Spring Framework 6 将采用 ...
- 通过引入switch表达式来增强Java switch语句
去年12月下旬,我发布了" Switch Expressions Coming Java? 从那时起,进行了广泛的讨论,表达了意见分歧,现在就Java的switch表达式的未来达成了共识. ...
- Java 9~Java 17主要更新了什么?
James Gosling:对继续坚守 Java8 的朋友,我想说"是时候作出改变了".新系统全方位性更强.速度更快.错误也更少.扩展效率更高.无论从哪个角度看,大家都有理由接纳 ...
- 从 java 8 到 java 17
Jdk17发布已经一年多了,java 8 实在是太老了,最近项目上准备从java 8 升级到 java 17. 本文整理和记录了部分 个人认为常用的新特性.以做记录和参考,如有不准确的地方,请大家指正 ...
- 【JDK】win 10 / win 11:jdk 8 升级为 jdk 17
目录 一.前言 二.历史版本 Java 安装 三.最新版本 Java 安装 (1)历史版本作废 (2)最新版本沿用旧版 JDK 系统环境变量 (3)JDK 17 下载 (4)JDK 17 安装 (5) ...
- 现在是时候将应用程序迁移到Java 17了?
原文作者:Johan Janssen,原文链接:It's time to move your applications to Java 17. Here's why-and how. 关于从以前的长期 ...
- wsl 或者window terminal 下出现Java 14 switch expressions unrecognized解决方法:升级java jdk到14 or later
文章目录 缘由 解决方法 参考 缘由 IDEA中build成功,但是automated build失败 $ ./gradlew> Task :compileJava FAILED Wordle/ ...
- java switch 表达式_尝鲜Java 12新特性:switch表达式
Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP.其中对Java语法的改进是JEP 325: switch表达式.于是我迫不及待,提前感受一下更先进的语言 ...
- java switch语句与switch表达式区别及使用
1.switch语句 与if/else语句不同,switch语句可以有许多可能的执行路径.switch可用于基本类型byte.short.char和int.它们各自的包装类型(byte.short.C ...
最新文章
- R主成分分析PCA示例
- 微软宣布MySQL和PostgreSQL的Azure数据库服务正式可用
- 追根究底之以不变求万变:利用SetCapture捕获鼠标
- 为啥我的Python这么慢 - 项查找 (二)
- 7-1 顶点的度 (15 分)
- 没有基础怎么学习Web前端?相关学习路线又是什么?
- 如何快速制作短视频?拥有这个神器,轻松搞定!
- 中国移动java项目_Java Web开发-项目部分(中国移动科技综合管理系统)视频——私塾在线提供...
- Smart210使用superboot刷机
- 大数据第一季--java基础(day5)-徐培成-专题视频课程
- .net 访问共享文件夹
- rest api解决url参数中带点的问题,REST正则匹配
- 使用BootStrap.编写网页
- 无线网卡安装后显示无服务器,USB无线网卡安装后连接图标不显示怎么办【解决方法】...
- 【联机对战】一张图看懂联机对战服务
- PS3视频媒体播放基本说明
- 使用VirtualBox创建虚拟机
- Ubuntu20 设置桌面壁纸自动切换
- layui弄一个好看的数据表格样式
- 命名实体识别(二)——基于条件随机场的命名实体识别
热门文章
- oralce分析函数---group by || rollup || cude || grouping || grouping sets
- linux添加静态ipv6路由,请问如何在CentOS7上配置已经静态路由好的IPv6地址块?
- gitlab CI CD
- Foobar2000 CUI界面foobox开发已经接近尾声
- 保留两位小数除法算式_小数除法计算题
- 细心整理近50个ARM开发相关的网站和学习资料
- 多元统计分析--判别(距离判别、Fisher判别、Bayes判别)
- 机器学习算法工程师也会遇到35岁这道坎么?
- 12、添加和删除页码符号
- 微信商户平台所有产品总结