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. Python获得操作日志的最后几行记录

    该方法一般用于获得操作日志的最后几行记录 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 f = open('seek.txt', 'rb') 4 ...

  2. 松灵机器人scout mini小车 自主导航(2)——仿真指南

    松灵机器人Scout mini小车仿真指南 之前介绍了如何通过CAN TO USB串口实现用键盘控制小车移动.但是一直用小车测试缺乏安全性.而松灵官方贴心的为我们准备了gazebo仿真环境,提供了完整 ...

  3. 如何让 MGR 不从 Primary 节点克隆数据?

    问题 MGR 中,新节点在加入时,为了与组内其它节点的数据保持一致,它会首先经历一个分布式恢复阶段.在这个阶段,新节点会随机选择组内一个节点(Donor)来同步差异数据. 在 MySQL 8.0.17 ...

  4. PHP转Go系列 | 推荐一个强大的Go语言工具函数库

    大家好,我是码农先森. 从 PHP 转到 Go 的朋友,常常会因为没有便捷的工具函数而感到苦恼.PHP 写的多了就会形成路径依赖,在写 Go 的时候时不时就会想到 PHP 强大的数组函数.当然写 Go ...

  5. java实现二维码登录功能

    本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码: <?xml version="1.0" encoding="UTF- ...

  6. Fidder响应数据SyntaxView乱码的处理方法

    当Fidder查看响应数据"SyntaxView"出现乱码时,可以点击上方菜单栏的"Decode"按钮,等"Decode"出现蓝色边框后再重 ...

  7. Mysql将查询出的数值转换为中文显示case..when..then

    我们经常需要在数据库导出文件,可是导出某些字段时不是中文含义其它同事分不清.可以通过case..when..then根据一一对应的关系将值转成中文,再进行导出方便大家查阅. 1.正常sql未处理之前查 ...

  8. 【SpringBoot】数据源加密处理

    代码审计报告提出的一个问题: 明文暴露配置信息风险 解决方案可以使用jasypt实现 需要使用依赖: <dependency> <groupId>com.github.ulis ...

  9. 近似最优的分层路径搜索(Near Optimal Hierarchical Path-Finding)—— A*算法的变种 —— 分层A*算法(HPA*)

    论文地址: https://webdocs.cs.ualberta.ca/~mmueller/ps/hpastar.pdf Near Optimal Hierarchical Path-Finding

  10. Ubuntu18.04下 修改conda环境和缓存默认路径

    查看conda 的默认环境和缓存默认路径:conda info  conda环境和缓存的默认路径(envs directories 和 package cache) envs directories  ...