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语句定义的变量名不能重复: 不能在 ...
随机推荐
- JS中this的几种指向
这些this的指向,是当我们调用函数的时候确定的.调用方式的不同决定了this的指向不同一般指向我们的调用者.普通函数调用 window.定时器函数 wind ...
- Mysql密码安全策略修改
Mysql5.7默认有密码安全策略,密码安全级别要求比较高,在测试环境中使用起来不方便,本经验将介绍如何修改Mysql的密码安全策略,解决ERROR 1819错误. 1:首先使用root用户连接mys ...
- 从Mybatis-Plus开始认识SerializedLambda
从Mybatis-Plus开始认识SerializedLambda 背景 对于使用过Mybatis-Plus的Java开发者来说,肯定对以下代码不陌生: @TableName("t_user ...
- C#:进程之间传递数据
一.思路 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有 使用内存映射文件 通过共享内存DLL共享内存 使用SendMessage向另一进程发送WM_COPYDATA ...
- char字符_C
字符的表示 字符类型由单引号' '包围,字符串由双引号" "包围. //正确的写法 char a = '1'; char b = '$'; char c = 'X'; char ...
- vuex使用和场景案例
vuex是vue提供的一个集中式状态管理器,用于对数据的集中式管理. vuex有四个重要的属性:state.mutations.actions.getters 1.vuex的使用 安装 npm ins ...
- CF1951
A link 这个题就是讨论. 首先,如果没有\(1\)就一定可以. 如果有\(1\). 如果长度为\(2\)一定不行. \(1\)的个数为奇数不行. 如果为偶数 有一个小点:如果是\(2\)个\(1 ...
- Bond4配置
Bongding聚合链路工作模式 > bond聚合链路模式共7种:0-6Mode > bond 0 负载均衡 轮询方式往每条链路发送报文,增加带宽和容错能力.容易出现数据包无序到达的问题, ...
- postfix&dovecot搭建邮件服务器
本篇参考 https://blog.51cto.com/5001660/2377785和小翔博客https://www.liuyixiang.com/post/113927.html. 邮件发送和接受 ...
- 【Kotlin】官网学习笔记
0.IDEA环境设置: 1.基础语法 BasicSyntax 地址:https://kotlinlang.org/docs/basic-syntax.html 一.方法与变量 可以直接编写main方法 ...