2025年Switch用法以及新特性-最全总结版

Switch用法以及新特性-最全总结版本篇文章参考了大佬文章 感谢大佬无私分享 http t csdnimg cn MjZnX http t csdnimg cn QFg0x 目录 一 Switch 用法 JDK7 及以前 1 1 举例一 1 2 举例二 二 Switch 穿透 2

大家好,我是讯享网,很高兴认识大家。

本篇文章参考了大佬文章,感谢大佬无私分享:

http://t.csdnimg.cn/MjZnX

http://t.csdnimg.cn/QFg0x

 

目录

  一、Switch用法:JDK7及以前

1.1、举例一:

1.2、举例二: 

 二、Switch穿透: 

2.1、举例:

三、Switch用法:JDK12及以后

 3.1、举例一:

 3.2、举例二: 

 3.3、举例三:

 3.4、举例四:(最完美的例子)

 3.5、Switch、Record、yield实现复杂计算举例:

  一、Switch用法:JDK7及以前

1、switch中的表达式的数据的数据类型为byte,short,int,char,String(jdk>1.7支持String类型)
2、default可以放在任意一行,但是不管放在那一行,都会先找第一个case去匹配,如果所有的case都不匹配,才会执行default,default可以省略不写,建议写上。
3、break可以不写,就容易造成switch的穿透现象


讯享网

        在JDK7以前,switch内的值仅支持byte、short、int、char类型或者枚举,在JDK7及以后,引入了对String类型的switch判断。代码如下: 

1.1、举例一:

 String match = "中国"; switch (match){ case "中国": System.out.println("China"); break; case "日本": System.out.println("鬼砸"); break; }

讯享网

1.2、举例二: 

讯享网import java.util.Scanner; public class SwitchDemo { public static void main(String[] args) { /* * 用户输入一个整数(月份),判断该月份处于什么季节? */ System.out.println("enter a month:"); Scanner input = new Scanner(System.in); //接收输入流,采用标准输入流 int month = input.nextInt(); switch (month){ case 12: case 1: case 2: System.out.println("winter"); break; case 3: case 4: case 5: System.out.println("spring"); break; case 6: case 7: case 8: System.out.println("summer"); break; case 9: case 10: case 11: System.out.println("autumn"); break; default: System.out.println("您输入的月份错误!"); } input.close(); //资源释放 } }

 二、Switch穿透: 

2.1、举例:

 int state =2; switch (state) { case 1: System.out.println("1"); case 2: System.out.println("2"); case 3: System.out.println("3"); default: System.out.println("4"); break; }

         输出结果为:2,3,4;即使state不为3和4,因为2中匹配后没有break,则后续代码则不会进行case判断,直到遇到break为止。

三、Switch用法:JDK12及以后

        在使用switch时有可能会出现”switch穿透“现象。如果你遗漏了break语句,有可能会造成严重的逻辑错误,所以为了防止意外出现”switch穿透“,从JDK 12开始,switch语句升级成了更简单的表达式语法,不再需要我们手动添加break语句。

        switch新特性:

1、在JDK 12的switch语句中,不用再写break语句,不会再出现switch的穿透现象;

2、如果case后面只有一条语句,可以直接在->后面编写该语句;如果有多条语句,需要用{}  括起来,当然也可以不使用->符号,继续采用以前的写法“:”也没问题;(下文有举例说明),但是 case 标签-> 与 case 标签不能同时混用;

3、JDK 13:完善了带返回值的switch语句,增加关键字yield;

4、如果只有一条语句,yield关键字可以省略: 

 3.1、举例一:

讯享网public class Demo01 { public static void main(String[] args) { // switch结构-case穿透 System.out.println("请选择你的国家"); Scanner sc = new Scanner(System.in); String country = sc.next(); switch (country) { case "中国" -> System.out.println("我是中国人,我自豪!"); case "日本" -> System.out.println("鬼子脚盆鸡"); case "美国" -> { System.out.println("暂时还是老大"); System.out.println("喜欢欺负人"); } default -> System.out.println("未知国籍,黑户"); } } }

3.2、举例二: 

import java.util.Scanner; public class SwitchDemo { public static void main(String[] args) { /* * 用户输入一个整数(月份),判断该月份处于什么季节? */ System.out.println("(switch新特性)enter a month:"); Scanner input = new Scanner(System.in); //接收输入流,采用标准输入流 int month = input.nextInt(); switch (month) { case 12, 1, 2 ->System.out.println("winter"); case 3, 4, 5 ->System.out.println("spring"); case 6, 7, 8 ->System.out.println("summer"); case 9, 10, 11 ->System.out.println("autumn"); default -> System.out.println("非法月份!"); } input.close(); //资源释放 } }

 3.3、举例三:

讯享网 @Test public void testRecord08(){ int week = 7; String memo = ""; switch(week){ case 1 -> memo = "今天是星期一,开始新的一周的工作了"; case 2,3,4,5,6 -> memo = "今天是工作日,搬砖"; case 7 -> memo = "今天星期七,休息咯"; default -> throw new IllegalArgumentException("无效日期"); } System.out.println(memo); }

 3.4、举例四:(最完美的例子)

        JDK 13:完善了带返回值的switch语句,增加关键字yield,yieldswitch 作为表达式,能够返回值,即yield作为switch表达式的返回值;

          在JDK 12的switch语句中,支持使用->符号,当然也可以不使用->符号,继续采用以前的写法“:”也没问题:

 @Test public void testSwitch() { int week = 2; String memo = switch(week){ case 1 : yield "星期一,工作"; case 2,3,4,5,6 : yield "工作日,继续工作"; case 7 : yield "星期七,休息咯"; default: yield "无效日期"; }; System.out.println(memo); }

        如果只有一条语句,yield关键字可以省略: 

讯享网import java.util.Scanner; public class SwitchExpression { public static void main(String[] args) { /* * 用户输入年份,判断十二生肖 * 0-11表示十二生肖,以monkey开始 */ System.out.println("(switch新特性)enter a year:"); Scanner input = new Scanner(System.in); //标准输入流 int year = input.nextInt(); //接收用户键盘输入的整数 year:年 String zodiac = switch(year % 12) { //注意这里switch表达式是有返回值的,且是必须的 case 0 -> "monkey"; //这里如果只有一条语句,返回的关键字是可以省略的,而且自带break case 1 -> "roster"; case 2 -> "dog"; case 3 -> { //注意如果需要多条语句,需要在花括号内进行,在switch表达式中,如果多条语句,最后的值返回需要使用yield关键字进行返回 System.out.println("计算选择器case == 3 的情况"); yield "pig"; //注意这里返回的关键字不是return,而是yield } case 4 -> "mouse"; case 5 -> "ox"; case 6 -> "tiger"; case 7 -> "rabbit"; case 8 -> "dragon"; case 9 -> "snake"; case 10 -> "horse"; case 11 -> "sheep"; default -> ""; //注意switch表达式的值必须是穷尽的,故defalult不能省略 }; input.close(); //资源释放 System.out.println(year + " is " + zodiac); } }

3.5、Switch、Record、yield实现复杂计算举例:

          没学过新特性Record的同学可以看本人此篇文章:http://t.csdnimg.cn/2a8pE

@Test public void testSwitch01(){ Line line = new Line(10,20); Rectangle rectangle = new Rectangle(20,50); Shape shape = new Shape(50,80); Object obj = line; int result = switch(obj){ case Line(int x, int y)->{ System.out.println("图象是Line,x:" + x + ", y:" + y); yield x + y; } case Rectangle(int w, int h)-> 2*(w + h); case Shape(int x, int y)->{ System.out.println("图像是shape"); yield x*y; } default -> 0; }; System.out.println("result = " + result); } 

 

小讯
上一篇 2025-01-26 16:14
下一篇 2025-01-28 07:25

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/29298.html