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

发布时间:2024年01月24日

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

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、举例四:(最完美的例子)

? 一、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后面只有一条语句,可以直接在->后面编写该语句;如果有多条语句,需要用{}? 括起来,当然也可以不使用->符号,继续采用以前的写法“:”也没问题;(下文有举例说明)

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);
	}
 
}


?

文章来源:https://blog.csdn.net/weixin_53676834/article/details/135829657
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。