Java21 Switch最全使用说明
Java21 Switch最全使用说明
Java 21 对 switch
语句进行了重大的改进和增强,使其变得更加灵活和强大。本文将详细介绍 Java 21 中 switch
语句的各种用法,包括基本语法、新特性、高级用法和最佳实践。
1. 基本语法
1.1 传统的 switch
语句
传统的 switch
语句支持 int
、char
、byte
、short
和 enum
类型的表达式。
public class TraditionalSwitchExample {public static void main(String[] args) {int number = 2;switch (number) {case 1:System.out.println("One");break;case 2:System.out.println("Two");break;case 3:System.out.println("Three");break;default:System.out.println("Unknown");}}
}
1.2 switch
语句作为表达式
从 Java 12 开始,switch
语句可以作为一个表达式使用,返回一个值。
public class SwitchExpressionExample {public static void main(String[] args) {int number = 2;String result = switch (number) {case 1 -> "One";case 2 -> "Two";case 3 -> "Three";default -> "Unknown";};System.out.println(result); // 输出 Two}
}
2. 新特性
2.1 类型模式匹配
Java 21 引入了类型模式匹配,允许在 switch
语句中直接匹配对象的类型,而无需显式的类型检查和转换。
public class TypePatternMatchingExample {public static void main(String[] args) {Object value = "Hello";String result = switch (value) {case String s -> s.length() + " characters";case Integer i -> i * 2 + " doubled";case null -> "Value is null";default -> "Unknown type";};System.out.println(result); // 输出 5 characters}
}
2.2 复杂表达式
switch
语句可以包含复杂的表达式,例如使用条件表达式。
public class ComplexExpressionExample {public static void main(String[] args) {String value = "YES";String result = switch (value) {case "YES" -> "You got it";case "NO" -> "Shame";default -> "Sorry?";};System.out.println(result); // 输出 You got it}
}
2.3 密封类模式匹配
Java 21 支持在 switch
语句中使用密封类模式匹配,这对于处理继承层次结构非常有用。
sealed interface S permits A, B, C { }
final class A implements S { }
final class B implements S { }
record C(int i) implements S { }public class SealedClassPatternMatchingExample {public static void main(String[] args) {S s = new A();int result = switch (s) {case A a -> 1;case B b -> 2;case C(int i) -> i;};System.out.println(result); // 输出 1}
}
2.4 守卫条件
可以在 case
标签中添加守卫条件,以进一步细化匹配逻辑。
public class GuardClauseExample {public static void main(String[] args) {Integer number = 5;String result = switch (number) {case Integer i when i > 0 -> "Positive";case Integer i when i < 0 -> "Negative";case 0 -> "Zero";default -> "Unknown";};System.out.println(result); // 输出 Positive}
}
3. 高级用法
3.1 结合 var
关键字
Java 21 允许在 case
标签中使用 var
关键字,自动推断变量类型。
public class VarKeywordExample {public static void main(String[] args) {Object value = "Hello";String result = switch (value) {case String var s -> s.length() + " characters";case Integer var i -> i * 2 + " doubled";case null -> "Value is null";default -> "Unknown type";};System.out.println(result); // 输出 5 characters}
}
3.2 多个 case
标签
可以将多个 case
标签组合在一起,以减少重复代码。
public class MultipleCaseLabelsExample {public static void main(String[] args) {String value = "Hello";String result = switch (value) {case "Hello", "Hi" -> "Greeting";case "Bye" -> "Farewell";default -> "Unknown";};System.out.println(result); // 输出 Greeting}
}
3.3 default
分支
default
分支用于处理没有匹配到的任何情况。
public class DefaultBranchExample {public static void main(String[] args) {String value = "Unknown";String result = switch (value) {case "Hello" -> "Greeting";case "Bye" -> "Farewell";default -> "Unknown";};System.out.println(result); // 输出 Unknown}
}
4. 最佳实践
4.1 使用类型模式匹配
类型模式匹配可以显著减少代码量,提高可读性和维护性。
public class BestPracticeTypePatternMatching {public static void main(String[] args) {Object value = "Hello";String result = switch (value) {case String s -> s.length() + " characters";case Integer i -> i * 2 + " doubled";case null -> "Value is null";default -> "Unknown type";};System.out.println(result); // 输出 5 characters}
}
4.2 使用守卫条件
守卫条件可以增加匹配逻辑的灵活性,避免过多的嵌套判断。
public class BestPracticeGuardClause {public static void main(String[] args) {Integer number = 5;String result = switch (number) {case Integer i when i > 0 -> "Positive";case Integer i when i < 0 -> "Negative";case 0 -> "Zero";default -> "Unknown";};System.out.println(result); // 输出 Positive}
}
4.3 使用 var
关键字
var
关键字可以减少类型声明,使代码更加简洁。
public class BestPracticeVarKeyword {public static void main(String[] args) {Object value = "Hello";String result = switch (value) {case String var s -> s.length() + " characters";case Integer var i -> i * 2 + " doubled";case null -> "Value is null";default -> "Unknown type";};System.out.println(result); // 输出 5 characters}
}
5. 总结
通过本文的介绍,你应该已经对 Java 21 中 switch
语句的使用方法有了全面的了解。switch
语句的新特性使得代码更加简洁、易读和功能强大。通过掌握其基本语法、新特性、高级用法和最佳实践,可以编写出更加优雅、高效的代码。
相关文章:
Java21 Switch最全使用说明
Java21 Switch最全使用说明 Java 21 对 switch 语句进行了重大的改进和增强,使其变得更加灵活和强大。本文将详细介绍 Java 21 中 switch 语句的各种用法,包括基本语法、新特性、高级用法和最佳实践。 1. 基本语法 1.1 传统的 switch 语句 传统的 sw…...
普通电脑上安装属于自己的Llama 3 大模型和对话客户端
#大模型下载地址:# Llama3 因为Hugging Face官网正常无法访问,因此推荐国内镜像进行下载: 官网地址:https://huggingface.co 国内镜像:https://hf-mirror.com GGUF 模型文件名称接受,如上述列表中&…...
微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪
html页面: 视频尺寸过大会画布会撑开屏幕,要下滑 尺寸和视频链接是从上个页面点击传过来的,可自行定义 <canvas id"cvs1" type"2d" style"width: {{videoWidth}}px;height: {{videoHeight}}px;"><…...

社交网络图中结点的“重要性”计算
题目描述 输入 输出 输入样例1 9 14 1 2 1 3 1 4 2 3 3 4 4 5 4 6 5 6 5 7 5 8 6 7 6 8 7 8 7 9 3 3 4 9 输出样例1 Cc(3)0.47 Cc(4)0.62 Cc(9)0.35 AC代码 #include <iostream> #include <vector> #include <queue> #include <iomanip>using na…...

前端(1)——快速入门HTML
参考: W3school 1. HTML 我使用的是vs code,在使用之前,先安装以下几个插件: Auto Rename TageHTML CSS SupportLive Server 1.1 HTML标签 HTML全称是 Hypertext Markup Language(超文本标记语言) HTML通过一系列的标签(也称为…...
gitlab角色、权限
GitLab是一个基于Web的Git仓库管理工具,它提供了一套完整的角色和权限管理机制,以控制用户对项目和仓库的访问和操作权限。以下是GitLab中不同角色的基本权限概述: 访客(Guest): 可以查看项目中的公开信息。…...

Python办公——批量eml文件提取附件
目录 专栏导读背景1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动…...
Spring Boot 中 Druid 连接池与多数据源切换的方法
Spring Boot 中 Druid 连接池与多数据源切换的方法 在Spring Boot项目中,使用Druid连接池和进行多数据源切换是常见的需求,尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...
JavaScrip中私有方法的创建
在 JavaScript 中,私有方法是指只能在类的内部使用,外部无法访问的函数。为了实现这一点,JavaScript 提供了几种方法,主要通过以下几种方式来创建私有方法: 1. 使用 #(私有字段和方法) 从 ECM…...
.Net Core根据文件名称自动注入服务
.Net Core根据文件名称自动注入服务 说明分析逻辑所有代码一键注入 说明 这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会…...

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护…...
第 3 章 -GO语言 基本语法
1. 注释 在编程中,注释是帮助理解代码的重要工具。Go语言支持两种类型的注释: 单行注释:以 // 开头,直到行尾都是注释。多行注释:以 /* 开始,以 */ 结束,可以跨越多行。 示例 package maini…...

【qt】控件
1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算,Geometry从黑圈算 程序证明:使用一个按键,当按键按下,qdebug打印各自左上角的坐标(相当于屏幕左上角),以及窗口大小 Widget::Widget(QWid…...

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
在现代化城市快速发展的背景下,安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展,智能化安防系统正逐步改变着传统的安全防护模式,特别是在行人入侵检测领域,视频智能分析平台Li…...

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...

【设计模式】行为型模式(二):策略模式、命令模式
行为型模式(二):策略模式、命令模式 3.策略模式(Strategy)3.1 示例3.1.1 定义策略接口3.1.2 实现具体策略3.1.3 定义上下文类3.1.4 客户端代码3.1.5 输出结果 3.2 总结3.2.1 优点3.2.2 缺点 4.命令模式(Com…...

STM32中断系统
目录 一、中断的基本概念 二、NVIC 1.NVIC的概念 2、NVIC的组成 3、NVIC的应用 4.NVIC的结构 三、外部中断EXTI 1.外部中断的概念 2.EXTI基本结构 四、EXTI外部中断的配置流程 1.开启APB2中的GPIO口/AFIO时钟 2.GPIO配置成输入模式 3.AFIO选择中断引脚 4.EXTI初始…...
window的Anaconda Powershell Prompt 里使用linux 命令
在 Windows 的 Anaconda Powershell Prompt 中使用 Linux 命令,可以通过以下几种方法来实现: 1. 使用 Git Bash 安装 Git for Windows 后,它会包含 Git Bash,允许在 Windows 上使用许多 Linux 命令。 步骤: 安装 Gi…...
Lisp 语言入门教程(一)
Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...
Git - Think in Git
记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后,工作区 与其余三个区不同 当使用 add 将修改的代码暂存后,索引区与 工作区 相同 当使用 commit 将修改的代码提交后,仓库区 与 索引区 和 工作区 相…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...