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

欢迎关注公众号:愚生浅末。


推荐阅读

  1. JDK有用的新特性-Java Record

  2. 严蔚敏 数据结构 配套教材 PDF

  3. 四款AI辅助工具,太强了...

JDK有用的新特性-Switch的更多相关文章

  1. JDK 5 ~ 10 新特性倾情整理!

    JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK ...

  2. JDK 5 ~ 11 新特性倾情整理

    为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~11的所有关键新特性! 先看一下JDK的版本迭代图: 注:   OpenJDK和JDK区别  GPL协议通用性公开许可证(General ...

  3. 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 ...

  4. JDK 14的新特性:instanceof模式匹配

    JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...

  5. 译文《全新首发JDK 16全部新特性》

    封面:洛小汐 译者:潘潘 JDK 8 的新特性都还没摸透,JDK 16 的新特性就提着刀来了. 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕.一般翻译文献特别是 技术专业领域 的内 ...

  6. JDK 14的新特性:更加好用的NullPointerExceptions

    JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...

  7. java8 (jdk 1.8) 新特性——Lambda

    java8 (jdk 1.8) 新特性 --初步认识 1. 什么是lambda? 目前已知的是,有个箭头  -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Ru ...

  8. JDK各版本新特性!

    1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取 ...

  9. jdk各版本新特性

    只收纳常用的新特性 jdk1.4 1.引入断言 jdk5 1.引入泛型 2.引入枚举Enum 3.可以自动拆装箱 4.引入注解Annotation 5.引入新的迭代方式foreach 6.引入静态导入 ...

  10. Java12新特性 -- switch表达式

    传统switch表达式的弊端: 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行: 所有的case语句共用一个块范围,在不同的case语句定义的变量名不能重复: 不能在 ...

随机推荐

  1. C#使用Aspose将Word\HTML 转换成PDF文件

    写在前面 Aspose 这个是收费的,直接使用是有水印的 需要用到的dll文件 ==> Aspose.Words.dll.Aspose.HTML.dll.Aspose.Total.lic(授权文 ...

  2. 写给rust初学者的教程(三):闭包、智能指针、并发工具

    这系列RUST教程一共三篇.这是最后一篇,介绍RUST语言的进阶概念.主要有闭包.智能指针.并发工具. 上一篇:写给rust初学者的教程(二):所有权.生存期 closure "闭包&quo ...

  3. IDEA社区版新建一个最简单的Spring工程(Spring框架搭建 01)

    创建Spring项目 IDEA打开New Project-Maven Archetype,选择Archetype:org.apache.maven.archetypes:maven-archetype ...

  4. IntersectionObserver 实现图片懒加载

    背景 最近使用express做导航类型网站,因为这个是后端jade渲染,浏览器拿到页面之后,解析出来dom结构,导致100+的图片瞬间加载,严重浪费了宽带资源,加重服务器负担,因此打算延迟加载图片 模 ...

  5. 服务之间的调用之RPC深入理解

    一:RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现有 XML-RPC , J ...

  6. Asp .Net Core 系列:基于 T4 模板生成代码

    目录 简介 组成部分 分类 Visual Studio 中使用T4模板 创建T4模板文件 2. 编写T4模板 3. 转换模板 中心控制Manager 根据 MySQL 数据生成 实体 简介 T4模板, ...

  7. [oeasy]python0080_设置RGB颜色_24bit_24位真彩色_颜色设置

    RGB颜色 回忆上次内容 上次 首先了解了 索引颜色 \33[38;5;XXXm 设置 前景为索引色 \33[48;5;XXXm 设置 背景为索引色 RGB每种颜色 可选0-5 总共 6 级 想用 精 ...

  8. Git的存储原理

    目录 Git 设计原理 Git vs SVN Git 存储模型 .git 目录结构 Git 基本数据对象 Git 包文件 Git 引用 Git 设计原理 概括的讲,Git 就是一个基于快照的内容寻址文 ...

  9. linux性能资源分析工具

    linux性能资源分析工具 1,top 2,ps 3,uptime 4,mpstat 5,pidstat 6,vmstat 7,iostat 8,netstat 9,lsof 10,sar / nmo ...

  10. ThinkPHP6支持金仓数据库(Kingbase)解决无法使用模型查询问题

    参考了很多前人的文章,最后只支持Db::query原生查询,不支持thinkphp数据模型方法,这在实际项目中是很难接受的,特分享出解决方案. 先按照流程配置如下: 1.准备工作 首先确认PHP支持金 ...