当前位置: 首页 > news >正文

Switch表达式

Java 12 引入了 Switch 表达式功能,这可以用来简化许多原本冗长的 switch 语句。

switch 语句通常用于替代大量的 ifelse if 判断,从而使代码更易读。不过,传统的 switch 语句自身也有些冗长,而且对 break 的严格要求也容易引发错误。switch 表达式就是为了解决这些问题而引入的:它更简洁、更不容易出错。

Switch 语句 vs Switch 表达式

它们的主要区别在于:

  • switch 语句 只能对一个已定义的变量进行赋值更新。

  • switch 表达式 本身会计算并返回一个值,因此可以直接赋值给变量。

此外,switch 表达式引入了一种新的箭头语法(->),进一步简化了代码的结构,提高了可读性,同时也不再需要使用 break 语句。
示例对比:

假设我们有一个枚举类用于“品尝”不同的事物,每种食物的评分是从 1 到 10,1 表示极其难吃,10 表示极其美味。

private enum ThingsToTaste { PIZZA, BROCCOLI, STEAK, SUGAR, DIRT, MEATBALLS, CHOCOLATE }

使用传统 switch 语句的写法:

int tasteValue = 0;
ThingsToTaste taste = ThingsToTaste.DIRT;switch (taste) {case SUGAR:case PIZZA:case CHOCOLATE:tasteValue = 10;break;case MEATBALLS:case STEAK:tasteValue = 7;break;case BROCCOLI:tasteValue = 4;break;case DIRT:tasteValue = 1;break;default:throw new IllegalStateException("Invalid tastable object: " + taste);
}
System.out.println(taste + ": " + tasteValue);

使用 switch 表达式的简洁写法:

int tasteValue = switch (taste) {case SUGAR, PIZZA, CHOCOLATE -> 10;case MEATBALLS, STEAK -> 7;case BROCCOLI -> 4;case DIRT -> 1;default -> throw new IllegalStateException("Invalid tastable object: " + taste);
};

可以看到,这种写法更短更清晰:

  • 不需要提前初始化 tasteValue

  • 每组相同的结果可以写在一行。

  • 不需要 break,箭头 -> 会自动停止并返回结果。

  • default 分支仍然保留用于兜底处理。


switch 表达式的三种处理方式:

  1. 返回一个具体值(如整数、字符串等)

  2. 抛出异常(如 throw new IllegalStateException(...)

  3. 使用代码块并通过 yield 返回值(Java 13 引入)

使用冒号语法 + yield(Java 13 起):

int tasteValue = switch (taste) {case SUGAR:case PIZZA:case CHOCOLATE:yield 10;case MEATBALLS:case STEAK:yield 7;case BROCCOLI:yield 4;case DIRT:yield 1;default:throw new IllegalStateException("Invalid tastable object: " + taste);
};

注意:

  • yield 只能用于 switch 表达式,不能用于 switch 语句。

  • 与传统 break 相比,yield 更明确表示这个 case 会返回一个值。

箭头语法 + 代码块 + yield(适合需要多行操作的场景):

tasteValue = switch (taste) {case SUGAR, PIZZA, CHOCOLATE -> {System.out.println(10);yield 10;}case MEATBALLS, STEAK -> {System.out.println(7);yield 7;}case BROCCOLI -> {System.out.println(4);yield 4;}case DIRT -> {System.out.println(1);yield 1;}default -> {throw new IllegalStateException("Invalid tastable object: " + taste);}
};

适用于你希望在返回值之前执行某些操作的场景(如打印、记录日志等)。


总结:

  • switch 表达式更简洁、易读,不易出错。

  • 它直接返回值,因此可以被赋值给变量。

  • 如果不是基于 enum,必须提供 default 分支以确保覆盖所有情况。

  • 箭头语法 -> 是最推荐的写法。

  • Java 13 的 yield 可用于多行代码块,进一步提高灵活性。

  • 记住:

    • switch 表达式 不能使用 break

    • switch 语句 不能使用 yield

http://www.dtcms.com/a/277622.html

相关文章:

  • 算法第三十二天--动态规划part01(第九章)
  • 苍穹外卖@RequestBody导错包导致接收不到传入参数
  • Linux锁的概念及线程同步
  • 互斥锁详解(操作系统os)
  • VUE3(二)、路由
  • 时序预测 | Pytorch实现CNN-KAN电力负荷时间序列预测模型
  • day16~17-系统负载高故障与磁盘管理
  • 【开源项目】拆解机器学习全流程:一份GitHub手册的工程实践指南
  • Dubbo-Admin 安装与使用指南:可视化管理 Dubbo 服务
  • 基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
  • Linux操作系统之信号概念启程
  • Scrapy Spider深度解析:从基础到高级应用实战
  • 基于MATLAB的Lasso回归的数据回归预测方法应用
  • 【论文阅读】AdaptThink: Reasoning Models Can Learn When to Think
  • muduo概述
  • DVWA CSRF漏洞分析与利用
  • Leaflet面试题及答案(61-80)
  • 梯度下降算法:像下山一样找到最优解
  • opencv4.12 vs2022 cmake contrib编译
  • (一)SAP GROUP REPORTING(集团报表)集团财务合并解决方案套件
  • ERA5的UV合并成矢量并按时间维度转为nc或tif
  • Excalidraw:一款颠覆传统思维的免费开源绘图工具
  • 28.安卓逆向2-frida hook技术-逆向os文件(一)
  • 零基础完全理解视觉语言模型(VLM):从理论到代码实践
  • TASK2 夏令营:用AI做带货视频评论分析
  • 【算法】递归、搜索与回溯
  • docker运行redis指定配置+jdk17安装在centos7
  • sklearn study notes[1]
  • uView UI 组件大全
  • spring-ai-alibaba 1.0.0.2 学习(十六)——多模态