Java 基础知识之 switch 语句和 yield 关键字

传统 switch 语句

传统的 switch 语句我们已经写了一万遍了,以下是一个典型的 switch 语句:

int dayOfWeek = 3;
switch (dayOfWeek) {
    case 1:
        System.out.println("星期一");
        break;
    case 2:
        System.out.println("星期二");
        break;
    case 3:
        System.out.println("星期三");
        break;
    case 4:
        System.out.println("星期四");
        break;
    case 5:
        System.out.println("星期五");
        break;
    case 6:
        System.out.println("星期六");
        break;
    case 7:
        System.out.println("星期日");
        break;
    default:
        System.out.println("星期???");
        break;
}

众所周知啊,写 switch 语句最重要的就是不能忘了 break 语句,这主要是 switch 的穿透机制。即 switch 结构在找到第一个匹配的 case 条件后,会顺序执行后面所有 case 对应的代码,无论是否判断为真,知道碰到 break 跳出。你可以看看上面写了多少个 break

这是40多年前 C 语言创造后,Java 原样照抄的经典语法,但在今天看来就老套和啰嗦了。

除去由穿透机制带来的大量 break 造成的代码冗余、可读性不好等缺点,这种传统的 switch 语句还有变量作用域混乱的问题。例如如下的代码是不能通过编译的:

switch (today) {
    case MODAY:
        int x = 1;
        break;
    default:
        int x = 0; //Variable x is already defined in the scope
}

Java 12 的 switch 语句 和 switch 表达式

由于上面的问题,Java 12 对 switch 语句进行了改造,使得语句变得更简洁清晰了。就像上面的传统 switch 语句,现在可以这么写了:

int dayOfWeek = 3;
switch (dayOfWeek) {
    case 1 -> System.out.print("星期一");
    case 2 -> System.out.print("星期二");
    case 3 -> System.out.print("星期三");
    case 4 -> System.out.print("星期四");
    case 5 -> System.out.print("星期五");
    case 6 -> System.out.print("星期六");
    case 7 -> System.out.print("星期日");
    default -> System.out.println("星期???");
}

这种写法在 case 之后使用 -> 符号,可以只执行之后的语句,不需要添加 break 关键字,没有穿透效应。但是如果后面跟多条语句,需要用大括号 { } 括起来。

这是 switch 作为普通语句(statement)来使用的,Java 12 之后,switch 还可以作为表达式(expression)来使用的。也就是说,从 Java 12 之后,switch 是可以有返回值的。

之前我们使用 switch 为变量赋值都是这样的:

String word;        //通过 switch 为此变量赋值
int dayOfWeek = 3;
switch(dayOfWeek) {
    case 1 :
        word = "星期一";
        break;
    case 2:
        word = "星期二";
        break;
    case 3:
        word = "星期三";
        break;
    default:
        word = "星期---";
        break;
}

现在使用 Java 12 的 switch 表达式,我们就可以将上面的代码改写为:

int dayOfWeek = 3;
String word = switch(dayOfWeek) {
    case 1 -> "星期一";
    case 2 -> "星期二";
    case 3 -> "星期三";
    default -> "星期---";
};     //主要此处要有分号

需要注意的是当 switch 作为表达式时,需要在 switch 结构后面加上分号。而且,当 switch 作为表达式使用时,每一个分支(casebreak)都必须有返回值(或者抛出异常)。

这里插播一下我的公众号,希望大家多多关注,以后我会发更多的高质量内容:
微信公众号二维码

yield 关键字

大多数时候,在 switch 表达式内部,我们会返回简单的值,这个时候就像上面一样将返回的值写在 -> 之后就行。但是,如果需要复杂的语句,例如写了很多语句放到 { } 中,那么此时,如何在此分支中返回一个值呢?这就需要用到 yield 关键字。

例如上面的代码我们可以改成这样:

int dayOfWeek = 3;
String word = switch(dayOfWeek) {
    case 1 -> "星期一";
    case 2 -> "星期二";
    case 3 -> "星期三";
    default -> {
        String result = "星期---";
        //do a lot of work.
        yield result;       //通过 yield 返回一个值
    }
};

在上面的 default 分支中,写了几行代码,并在最后用 yield 返回了这个值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/780456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32-I2C

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…

Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求 1.1实验目的 掌握Java GUI编程技术,了解Swing框架的使用。 掌握MySQL数据库的基本操作,了解如何在Java中连接和操作数据库。 掌握用户权限管理的基本概念和实现方法。 提升综合运用所学知识设计和实现一个完整应用系统的能力…

QThread moveToThread的妙用

官方文档描述 总结就是移动到线程的对象不能有父对象,执行start即起一个线程,示例是将myObject移动到主线程中。QT中这种方式起一个线程是非常简单的。 示例描述以及代码 描述往Communicate线程中频繁添加任务,等任务结束的时候统计计算的结…

【python教程】数据分析——numpy、pandas、matplotlib

【python教程】数据分析——numpy、pandas、matplotlib 文章目录 什么是matplotlib安装matplotlib,画个折线 什么是matplotlib matplotlib:最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建 安装matplotlib&…

Node 中基于 Koa 框架的 Web 服务搭建实战

前言 在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化 http模块代码回顾 const http require("http");const server http.createServer((req, res) > {if (reqUrl.pathna…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展,笔者在学习这些内容时,特地整理记录下来,以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类,Integer和int区别是什么? 使用封装类的目的 对象化:…

阶段三:项目开发---搭建项目前后端系统基础架构:任务13:实现基本的登录功能

任务描述 任务名称: 实现基本的登录功能 知识点: 了解前端Vue项目的基本执行过程 重 点: 构建项目的基本登陆功能 内 容: 通过实现项目的基本登录功能,来了解前端Vue项目的基本执行过程,并完成基…

前端面试题17(js快速检索方法详解)

在前端JavaScript中,快速检索数据通常涉及到数组或对象的搜索。这里我会介绍几种常见的快速检索方法,并提供相应的代码示例。 1. 数组的find和findIndex方法 find: 返回数组中满足条件的第一个元素的值。findIndex: 返回数组中满足条件的第一个元素的索…

基于LSTM的股票价格预测

摘要 本课设旨在利用LSTM(长短期记忆)网络实现股票价格预测,通过收集、预处理股票数据集,并构建预测模型进行训练与优化。实验结果显示,经过优化调整模型参数,模型在测试集上取得了较为理想的预测效果。尽…

《征服数据结构》SparseArray

摘要: 1,SparseArray的介绍 2,SparseArray的代码实现 1,SparseArray的介绍 前面我们讲过《ArrayMap》,用它来实现哈希表,其中存放key和value的数组长度是存放散列表数组长度的二倍。 在哈希表中如果key值是…

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge😎 前言🙌Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…

vb.netcad二开自学笔记2:认识vs编辑器

认识一下宇宙第一编辑器的界面图标含义还是很重要的,否则都不知道面对的是什么还怎么继续? 一、VS编辑器中常见的图标的含义 变量 长方体:变量 局部变量 两个矩形块:枚举 预定义的枚举 紫色立方体:方法 橙色树状结构…

通过AIS实现船舶追踪与照射

前些天突然接到个紧急的项目:某处需要实现对夜航船只进行追踪并用激光灯照射以保障夜航安全。这个项目紧急到什么程度呢?!现场激光灯都安装好了,还有三个星期就要验收了,但上家没搞定就甩给我们了:( 从技术上看&#…

Java -- 实现MD5加密/加盐

目录 1. 加密的引出2. MD5介绍3. 解决MD5不可解密方法4. 实现加密解密4.1 加密4.2 验证密码 1. 加密的引出 在MySQL数据库中,一般都需要把密码、身份证、电话号码等信息进行加密,以确保数据的安全性。如果使用明文来存储,当数据库被入侵的时…

力扣考研经典题 反转链表

核心思想 头插法: 不断的将cur指针所指向的节点放到头节点之前,然后头节点指向cur节点,因为最后返回的是head.next 。 解题思路 1.如果头节点是空的,或者是只有一个节点,只需要返回head节点即可。 if (head null …

Vatee万腾平台:创新科技,驱动未来

在科技日新月异的今天,每一个创新的火花都可能成为推动社会进步的重要力量。Vatee万腾平台,作为科技创新领域的佼佼者,正以其卓越的技术实力、前瞻性的战略眼光和不懈的探索精神,驱动着未来的车轮滚滚向前。 Vatee万腾平台深知&am…

公有链、私有链与联盟链:区块链技术的多元化应用与比较

引言 区块链技术自2008年比特币白皮书发布以来,迅速发展成为一项具有颠覆性潜力的技术。区块链通过去中心化、不可篡改和透明的方式,提供了一种全新的数据存储和管理方式。起初,区块链主要应用于加密货币,如比特币和以太坊。然而&…

RUST 编程语言 绘制随机颜色图片 画圆形 画矩形 画直线

什么是Rust Rust是一种系统编程语言,旨在提供高性能和安全性。它是由Mozilla和其开发社区创建的开源语言,设计目标是在C的应用场景中提供一种现代、可靠和高效的选择。Rust的目标是成为一种通用编程语言,能够处理各种计算任务,包…

STM32-OC输出比较和PWM

本内容基于江协科技STM32视频内容,整理而得。 文章目录 1. OC输出比较和PWM1.1 OC输出比较1.2 PWM(脉冲宽度调制)1.3 输出比较通道(高级)1.4 输出比较通道(通用)1.5 输出比较模式1.6 PWM基本结…