首页 > 其他分享 >JDK 17 以上 switch 语句的 变化

JDK 17 以上 switch 语句的 变化

时间:2024-08-16 16:31:42浏览次数:11  
标签:case 语句 JDK 17 System switch println out

在JDK 17中,switch语句得到了显著的增强,引入了模式匹配(Pattern Matching)等特性,使得代码更加简洁、高效。以下是JDK 17中switch语句的主要用法和特点:

1. 格式变化

在JDK 17中,switch语句的格式发生了改变,主要体现在以下几个方面:

  • 冒号变为箭头:传统的switch语句中的冒号(:)在JDK 17中被箭头(->)所替代。
  • 支持模式匹配:可以在case标签中使用类型模式进行匹配,而不仅仅是常量值。
  • 支持多个值:一个case标签可以匹配多个值,使用逗号分隔。
  • 不需要break:在switch表达式中,由于每个case后直接跟随箭头和表达式或代码块,因此不需要break语句来阻止代码穿透。

2. 用法示例

作为普通语句使用

String score = "C";
switch (score) {
    case "A", "B" -> System.out.println("成绩不错");
    case "C", "D", "F" -> System.out.println("成绩不足");
    default -> System.out.println("成绩输入错误");
}

作为表达式使用

在JDK 17中,switch语句也可以作为一个表达式使用,其返回值可以被赋给变量。

String score = "B";
String judge = switch (score) {
    case "A", "B" -> "成绩还不错,继续保持";
    case "C", "D", "F" -> "成绩不足,继续努努力";
    default -> "成绩输入错误";
};
System.out.println(judge); // 输出: 成绩还不错,继续保持

如果case块中有多条语句,并且需要返回值,可以使用大括号{}包围代码块,并使用yield关键字来返回值。

String score = "B";
String judge = switch (score) {
    case "A", "B" -> {
        System.out.println("成绩不错");
        yield "优良";
    }
    case "C", "D", "F" -> {
        System.out.println("成绩不足,继续努力");
        yield "不足";
    }
    default -> "成绩输入错误";
};
System.out.println(judge); // 输出: 成绩不错
// 接着输出: 优良

3. 模式匹配

在JDK 17中,switch语句支持模式匹配,这意味着你可以在case标签中直接匹配对象的类型,并执行相应的操作。

Object obj = "Hello";
switch (obj) {
    case String s -> System.out.println("处理字符串: " + s);
    case Integer i -> System.out.println("处理整数: " + i);
    case null -> System.out.println("处理null值");
    default -> System.out.println("未知类型");
}

4. 注意事项

  • 在使用switch表达式时,如果case块中有多条语句且需要返回值,必须使用大括号{}包围代码块,并使用yield关键字返回值。
  • 在使用switch语句进行模式匹配时,需要确保选择器表达式的类型与case标签中的模式类型兼容。
  • JDK 17中的switch语句增强了类型检查,选择器表达式的类型可以是基本类型或任何引用类型(包括null)。

综上所述,JDK 17中的switch语句通过引入模式匹配、支持多个值匹配、改变格式以及作为表达式使用等特性,极大地提高了代码的简洁性和可读性。

标签:case,语句,JDK,17,System,switch,println,out
From: https://www.cnblogs.com/del88/p/18363103

相关文章

  • P4653 [CEOI2017] Sure Bet
    上链接[CEOI2017]SureBet题目描述现在有$n$个A类灯泡和$n$个B类灯泡,每个灯泡都有各自的权值。我们将这些灯泡分为$n$组,每组包含一个来自A类的灯泡和一个来自B类的灯泡。你可以从中选取任意个灯泡,每选取一个灯泡需要花费$1$的代价。在你选取完之后,系统会随机在A类......
  • JDK源码——String相关
    StringJDK源码中的String类是Java中最常用的类之一,它提供了许多用于处理字符串的方法。以下是一些常用的String类方法:构造方法:String():创建一个空字符串。String(char[]value):根据字符数组创建一个新的字符串。String(byte[]bytes,intoffset,intlength):根据字节数......
  • Navicat Premium v17 中文版 激活图文教程
    Navicat17全新升级,软件增强了数据库管理和数据分析的功能体验。其中包括模型设计与同步、数据字典、数据分析(dataprofiling)、用户体验、查询优化、BI功能集成MongoDB/Snowflake、专注模式、Redis哨兵模式与平台扩展LinuxARM等。此次升级让用户在数据库的创建、管理、......
  • [ARC178E] Serval Survival
    MyBlogs[ARC178E]ServalSurvival非常生气,点开一道看起来很正常的计数,推着推着就发现需要多项式/fn。首先对于“撞上了之后调头”这种东西有经典的思想:可以看成是互相穿过并没有调头。但是因为要求第\(i\)只猫走过的路,所以可以看成是和撞上的猫互换身份。手玩一下可以发现......
  • Cisco Nexus 9000v Switch, NX-OS Release 10.5(1)F - 用于网络原型设计和学习研究的
    CiscoNexus9000vSwitch,NX-OSRelease10.5(1)F用于网络原型设计和学习研究的虚拟化数据中心交换机请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/,查看最新版。原创作品,转载请保留出处。ReleaseDateNX-OSSystemSoftwareReleaseDateCiscoNX-OSRe......
  • [lnsyoj3174/luoguP4823/TJOI2013]拯救小矮人
    题意给定序列\(a,b\)和常数\(h\),若序列中存在值\(k\)满足\(b_k+\sum_{i=1}^{\operatorname{len}(a)}a_i\geh\),则可将\(a_k,b_k\)删除,求从\(a\)中删除的数的数量最大为多少。sol由于\(b\)越小的数越靠后越难被删除,同时,\(a\)越大的数越可以帮助其他数字被删除,因......
  • [lnsyoj2271/luoguP3745/省选联考 2017]期末考试
    题意给定长度为\(n\)的序列\(t\)和长度为\(m\)的序列\(b\),以及常数\(A,B,C\),可以进行两种操作:选取任意\(1\lex,y\len\),并使\(b_x+1,b_y-1\),记进行了\(\alpha\)次这种操作;选取任意\(1\lez\len\),并使\(b_z-1\),记进行了\(\beta\)次这种操作。求进......
  • 【2-sat】P4171 [JSOI2010] 满汉全席
    P4171[JSOI2010]满汉全席-洛谷大意:n个点m个条件形如m1,h32,满足n个条件思路:2-sat让m=0,h=1,然后转换为imjh的建图,注意傻逼题目的数字可能是多位数不能直接x[1]-'0'#include<cstdio>#include<stack>#include<iostream>#include<cstring>#include<cma......
  • JDK8-17期间增加的新特性
    JDK新特性1.Lambda表达式在Java中,Lambda表达式是一种简洁的表示匿名函数的方法。它们提供了一种方式来传递代码作为数据,这在实现某些接口(特别是那些只包含一个抽象方法的接口,即函数式接口)时特别有用。Lambda表达式使得代码更加简洁,并提高了可读性。1.1.基本语法Java中Lambda表......
  • 面试官:JDK中都用了哪些设计模式?
    设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK中都用了哪些设计模式?我按照大家比较熟悉且好理解的方式,把JDK中使用的设计模......