Java17新特性之Switch表达式改进的使用小结

 更新时间:2025年10月01日 11:21:07   作者:自由的疯  
Java17对​​switch​​表达式进行了进一步改进,使其更加简洁、直观,并支持更现代的编程风格,本文就来详细的介绍一下,感兴趣的可以了解一下

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

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

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

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

示例:

// 传统 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​​”问题。

示例:

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​​ 返回值。

示例:

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​​ 表达式可以用于更复杂的类型检查和解构操作。

示例:

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

sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

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

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

示例:

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

正确的写法:

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

到此这篇关于Java17新特性之Switch表达式改进的使用小结的文章就介绍到这了,更多相关Java17 Switch表达式改进内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailedException: Validation Failed

    解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailed

    这篇文章主要介绍了解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailedException: Validation Failed问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java实现简单密码加密功能

    Java实现简单密码加密功能

    这篇文章主要为大家详细介绍了Java实现简单密码加密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Java数组反转方式

    Java数组反转方式

    这篇文章主要介绍了Java数组反转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Springboot+AOP实现返回数据提示语国际化的示例代码

    Springboot+AOP实现返回数据提示语国际化的示例代码

    这篇文章主要介绍了Springboot+AOP实现返回数据提示语国际化的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • java父子线程之间实现共享传递数据

    java父子线程之间实现共享传递数据

    本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题
    2025-02-02
  • SpringBoot项目更换项目名称的实现

    SpringBoot项目更换项目名称的实现

    本文主要介绍了SpringBoot项目更换项目名称,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Mybatis把返回结果封装成map类型的实现

    Mybatis把返回结果封装成map类型的实现

    本文主要介绍了Mybatis把返回结果封装成map类型的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • java图片识别文字的方法

    java图片识别文字的方法

    这篇文章主要为大家详细介绍了java图片识别文字的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • java继承中的构造方法实例解析

    java继承中的构造方法实例解析

    这篇文章主要介绍了java继承中的构造方法实例解析,针对继承中的构造方法的特点进行了实例分析,需要的朋友可以参考下
    2014-10-10
  • Java Swing组件单选框JRadioButton用法示例

    Java Swing组件单选框JRadioButton用法示例

    这篇文章主要介绍了Java Swing组件单选框JRadioButton用法,结合具体实例形式分析了Swing单选框JRadioButton的使用方法及相关操作注意事项,需要的朋友可以参考下
    2017-11-11

最新评论