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​​ 表达式变得更加现代化,能够更好地适应现代开发需求,同时提高了代码的简洁性和安全性。

相关推荐
夕颜1118 分钟前
Claude AI 编程初体验
后端
Dcs8 分钟前
IDEA 2025.2又整大活!AI 助手脱胎换骨,Spring 调试一秒看透,连 Java 25 和虚拟线程都安排上了!
java
程序员爱钓鱼12 分钟前
Go语言实战案例:使用WaitGroup等待多个协程完成
后端·go·trae
程序员海军20 分钟前
告别低质量Prompt!:字节跳动PromptPilot深度测评
前端·后端·aigc
程序员爱钓鱼20 分钟前
Go语言实战案例:任务调度器:定时执行任务
后端·go·trae
沙蒿同学27 分钟前
Golang单例模式实现代码示例与设计模式解析
后端·go
Apifox28 分钟前
如何在 Apifox 中给字段设置枚举(比如字符串、数组等)?
后端·ai编程·测试
Boilermaker199238 分钟前
【Java EE】Spring AOP
java·java-ee
用户4976360000601 小时前
内部类不能bean注入
后端
Code blocks1 小时前
SpringBoot中策略模式使用
java·spring boot·后端·mybatis·策略模式