JDK有用的新特性-Switch
Switch 的三个方面,参考: JEP 361
- 支持箭头表达式
- 支持 yied 返回值
- 支持 Java Record
箭头表达式,新的 case 标签
Switch 新的语法,case label -> 表达式|throw 语句|block
case label_1, label_2, ..., label_n -> expression;|throw-statement;|block
step1:新的 case 标签
week:表示周日(1)到周六(7),1 和 7 是休息日,其他是工作日。如果 1-7 以外为无效日期
@Test
public void test01() {
int week = 7;
String memo = "";//表示计算结果
switch (week){
case 1 -> memo = "星期日,休息";
case 2,3,4,5,6 -> memo = "工作日";
case 7 -> memo ="星期六,休息";
default -> throw new RuntimeException("无效的日期");
}
System.out.println("memo = " + memo);
}

yeild 返回值
yeild 让 switch 作为表达式,能够返回值
语法
变量 = switch(value) { case v1: yield 结果值; case v2: yield 结果值;case v3,v4,v5.. yield 结果值 }
示例: yield 返回值,跳出 switch 块
@Test
public void test02() {
int week = 2;
String memo = switch (week){
case 1 :yield "星期日";
case 2,3,4,5,6 :yield "工作日";
case 7 : yield "星期六";
default:yield "无效日期";
};
System.out.println("memo = " + memo);
}

无需中间变量, switch 作为表达式计算,可以得到结果。yield 是表达式的返回值
示例: 多表达式, case 与 yield 结合使用
@Test
public void test03() {
int week = 3;
String memo = switch (week){
case 1 -> {
System.out.println("星期日,执行了自定义代码");
yield "星期日";
}
case 2,3,4,5,6 -> {
System.out.println("工作日,执行了自定义代码");
yield "2-6工作日";
}
case 7 -> {
System.out.println("星期六,执行了自定义代码");
yield "星期六";
}
default -> {
System.out.println("执行了自定义代码");
yield "其他日期";
}
};
System.out.println("memo = " + memo);
}

提示:
case 标签-> 与 case 标签:不能混用。 一个 switch 语句块中使用一种语法格式。
switch 作为表达式,赋值给变量,需要 yield 或者 case 标签-> 表达式。->右侧表达式为 case 返回值。
示例:
public void test(){
int week = 1;
//yield 是 switch 的返回值, yield 跳出当前 switch 块
String memo = switch (week){
case 1 ->{
System.out.println("week=1 的 表达式部分");
yield "星期日,休息";
}
case 2,3,4,5,6 ->{
System.out.println("week=2,3,4,5,6 的 表达式部分");
yield "工作日";
}
case 7 -> "星期六,休息";
default -> "无效日期";
};
System.out.println("week = " + memo);
}
}
Java Record
switch 表达式中使用 record,结合 case 标签-> 表达式,yield 实现复杂的计算
step1: 准备三个 Record
public record Line(int x,int y) {
}
public record Rectangle(int width,int height) {
}
public record Shape(int width,int height) {
}
step2: switch record
@Test
public void test04() {
//创建对象
Line line = new Line(10,20);
Rectangle rectangle = new Rectangle(20,50);
Shape shape = new Shape(50,80);
Object obj = line;
int result = switch (obj){
case Line(int x,int y) -> {
System.out.println("图形是Line,x:"+ x +",y:" +y);
yield x+y;
}
case Rectangle(int w,int h) -> 2*(w+h);
case Shape(int x,int y) ->{
System.out.println("图形Shape");
yield x*y;
}
default -> 0;
};
System.out.println("result = " + result);
}

case Line , Rectangle,Shape 在代码块执行多条语句,或者箭头->表达式。
公众号本文地址:https://mp.weixin.qq.com/s/TncbVznOSbVIShEQxOny8w
欢迎关注公众号:愚生浅末。
推荐阅读
JDK有用的新特性-Switch的更多相关文章
- JDK 5 ~ 10 新特性倾情整理!
JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK ...
- JDK 5 ~ 11 新特性倾情整理
为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~11的所有关键新特性! 先看一下JDK的版本迭代图: 注: OpenJDK和JDK区别 GPL协议通用性公开许可证(General ...
- Java JDK 1.7 和 JDK 1.8 新特性
0 引言 本文主要介绍 Java JDK 中 1.7 和 1.8 的新特性. 1 JDK 1.7 新特性 1. switch可以接受String类型: public class Switch { pu ...
- JDK 14的新特性:instanceof模式匹配
JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...
- 译文《全新首发JDK 16全部新特性》
封面:洛小汐 译者:潘潘 JDK 8 的新特性都还没摸透,JDK 16 的新特性就提着刀来了. 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕.一般翻译文献特别是 技术专业领域 的内 ...
- JDK 14的新特性:更加好用的NullPointerExceptions
JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...
- java8 (jdk 1.8) 新特性——Lambda
java8 (jdk 1.8) 新特性 --初步认识 1. 什么是lambda? 目前已知的是,有个箭头 -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Ru ...
- JDK各版本新特性!
1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取 ...
- jdk各版本新特性
只收纳常用的新特性 jdk1.4 1.引入断言 jdk5 1.引入泛型 2.引入枚举Enum 3.可以自动拆装箱 4.引入注解Annotation 5.引入新的迭代方式foreach 6.引入静态导入 ...
- Java12新特性 -- switch表达式
传统switch表达式的弊端: 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行: 所有的case语句共用一个块范围,在不同的case语句定义的变量名不能重复: 不能在 ...
随机推荐
- ubuntu20使用php+apache+adminer搭建mysql网页管理工具
前言 使用 php7+apache2+adminer 搭建网页版mysql管理工具,现将自己的搭建过程记录下来,留作后续参考.可参考其中配置,由于只配置了一次环境,可能有的步骤是多余的,后续可能会 ...
- Java中final用法与详解
final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的. 这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. final应用于基本数据类型 1 ...
- 6.Class 与 Style 绑定
操作元素的 class 列表和内联样式是数据绑定的一个常见需求. 因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可. 不过,字符串拼接麻烦且易错.因此,在 ...
- Java Redis多限流
Java Redis多限流 在Java中实现Redis多限流通常涉及使用Redis的某些特性,如INCR.EXPIRE.Lua脚本或者更高级的Redis数据结构如Redis Bitmaps.Redis ...
- 拥抱未来:GPT-4将如何改变我们的世界
随着人工智能技术的迅猛发展,我们正迎来一个全新的智能时代.在这个时代的前沿,GPT-4作为开拓者和领航者,正在重新定义人机交互.创意创新和个性化服务的标准.无论是在商业领域.教育场景还是科研领域,GP ...
- iOS开发基础109-网络安全
在iOS开发中,保障应用的网络安全是一个非常重要的环节.以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中 ...
- oeasy教您玩转vim - 29 - # 垂直翻页
垂直翻页 回忆上节课内容 我们上次了解了横向滚动的相关信息 横滚幅度 - sidescroll 横滚留位 - sidescrolloff 自动换行 - wrap g j.g k 可以逐行上下移动 ...
- 靶机: AdmX_new
靶机: AdmX_new 准备阶段 靶机:https://download.vulnhub.com/admx/AdmX_new.7z 下载后进行 MD5:2948034da23a8acc1285fd4 ...
- CCF 有趣的数
问题描述: 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1 ...
- Label Studio数据标注--通过源码安装
Label Studio是Heartex公司开发的一款在线数据标注工具,分为社区版(开源)和企业版(云服务,收费),企业版提供了增强的安全性(单点登录.角色基于访问控制.SOC2).团队管理.分析和报 ...