Java 17 新特性之 Switch 表达式改进

Java 17 对 ​​switch​​ 表达式进行了进一步改进,使其更加简洁、直观,并支持更现代的编程风格。这些改进最初在 Java 12 和 Java 13 中作为预览特性引入,最终在 Java 14 中成为正式特性。Java 17 继续支持并增强了这一功能。

以下是 ​​switch​​ 表达式改进的关键点:


1. ​​switch​​ 作为表达式

传统上,​​switch​​​ 是一个语句(statement),而从 Java 14 开始,​​switch​​ 可以作为一个表达式(expression)来使用。这意味着它可以返回一个值,从而简化代码逻辑。

示例:

arduino 复制代码
// 传统 switch 语句
int dayNumber;
String day = "MONDAY";
switch (day) {
    case "MONDAY":
    case "TUESDAY":
    case "WEDNESDAY":
        dayNumber = 1;
        break;
    case "THURSDAY":
        dayNumber = 2;
        break;
    default:
        dayNumber = 0;
}

// 使用 switch 表达式
int dayNumber = switch (day) {
    case "MONDAY", "TUESDAY", "WEDNESDAY" -> 1;
    case "THURSDAY" -> 2;
    default -> 0;
};

关键点:

  • 使用箭头语法 ​->​ 替代传统的 ​case​​break​
  • 每个分支直接返回一个值,无需 ​break​
  • 多个 ​case​ 可以用逗号分隔,例如 ​case "MONDAY", "TUESDAY", "WEDNESDAY"​

2. 箭头语法 (​​->​​)

箭头语法是 ​​switch​​​ 表达式的亮点之一,它消除了传统 ​​switch​​​ 语句中常见的"漏掉 ​​break​​"问题。

示例:

sql 复制代码
String result = switch (day) {
    case "MONDAY" -> "Start of the work week";
    case "FRIDAY" -> "End of the work week";
    case "SATURDAY", "SUNDAY" -> "Weekend!";
    default -> "Midweek days";
};
System.out.println(result);

优点:

  • 更加简洁,避免了传统 ​switch​ 的冗长结构。
  • 不需要显式地写 ​break​,减少了出错的可能性。

3. 支持块表达式

如果某个 ​​case​​​ 需要执行多行代码,可以使用大括号 ​​{}​​​ 定义一个块表达式,并通过 ​​yield​​ 返回值。

示例:

arduino 复制代码
String result = switch (day) {
    case "MONDAY" -> "Start of the work week";
    case "FRIDAY" -> {
        System.out.println("It's Friday!");
        yield "End of the work week"; // 使用 yield 返回值
    }
    case "SATURDAY", "SUNDAY" -> "Weekend!";
    default -> "Midweek days";
};

注意:

  • 在块表达式中,必须使用 ​yield​ 来返回值。
  • ​yield​ 是专门为 ​switch​ 表达式设计的关键字。

4. 模式匹配(Pattern Matching)的支持

Java 17 引入了对模式匹配的初步支持,这使得 ​​switch​​ 表达式可以用于更复杂的类型检查和解构操作。

示例:

假设我们有一个类层次结构:

java 复制代码
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

我们可以使用 ​​switch​​ 表达式进行模式匹配:

scss 复制代码
double area = switch (shape) {
    case Circle c -> Math.PI * c.radius() * c.radius();
    case Rectangle r -> r.width() * r.height();
};
System.out.println("Area: " + area);

关键点:

  • 这种模式匹配结合了 ​instanceof​​switch​ 的功能。
  • 直接在 ​case​ 中解构对象(如 ​Circle c​​Rectangle r​)。

5. 默认行为

在 ​​switch​​ 表达式中,所有可能的情况都必须被覆盖,否则会导致编译错误。这是为了确保表达式总是能返回一个值。

示例:

arduino 复制代码
int number = switch (value) {
    case 1 -> 10;
    case 2 -> 20;
    // 缺少 default 会报错
};

正确的写法:

arduino 复制代码
int number = switch (value) {
    case 1 -> 10;
    case 2 -> 20;
    default -> 0; // 必须有 default 或覆盖所有情况
};

6. 总结与优势

​switch​​ 表达式的改进带来了以下好处:

  1. 更简洁的语法
  • 使用箭头语法 ​->​ 和块表达式 ​{}​,减少冗余代码。
  • 不再需要手动写 ​break​
  1. 更安全的逻辑
  • 所有可能的分支都必须被覆盖,避免遗漏。
  1. 支持现代特性
  • 结合模式匹配,支持更复杂的类型检查和数据解构。
  1. 提高可读性
  • 代码更加直观,易于理解和维护。

适用场景

  • 简单的条件判断 :替代传统的 ​if-else​​switch​ 语句。
  • 复杂的数据处理:结合模式匹配,处理不同类型的对象。
  • 多分支逻辑:如状态机、解析器等场景。

通过这些改进,Java 的 ​​switch​​ 表达式变得更加现代化,能够更好地适应现代开发需求,同时提高了代码的简洁性和安全性。

相关推荐
脑壳疼___8 分钟前
若依 springboot websocket
java·spring
咖啡教室2 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友2 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡2 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
失散133 小时前
分布式专题——23 Kafka日志索引详解
java·分布式·云原生·架构·kafka
西红柿维生素3 小时前
CPU核心数&线程池&设计模式&JUC
java
云虎软件朱总3 小时前
配送跑腿系统:构建高并发、低延迟的同城配送系统架构解析
java·系统架构·uni-app
18538162800余+3 小时前
深入解析:什么是矩阵系统源码搭建定制化开发,支持OEM贴牌
java·服务器·html
李昊哲小课3 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
code123133 小时前
tomcat升级操作
java·tomcat