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

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三极管的奥秘:如何用小电流控制大电流

双极性晶体管(英语:bipolar transistor),全称双极性结型晶体管(bipolar junction transistor, BJT),俗称三极管,是一种具有三个引脚的电子元器件。 本文是讲述的是三极管的基础知识…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库,可对通信双方流通的字节序列进行加解密,保障通信的安全。本文以c编写的tcp server和tcp client为例子,openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

企业内部知识库搭建教程,赶紧收藏起来

在企业运营中,内部知识库搭建是一项重要的挑战,并需要合理的规划与管理。尤其对于中大型企业,内部知识库能够提高工作效率,减轻员工工作压力与突发事件的处理的困扰。下面给大家提供一份完整的内部知识库搭建教程,快看…

UE4运用C++和框架开发坦克大战教程笔记(十五)(第46~48集)

UE4运用C和框架开发坦克大战教程笔记(十五)(第46~48集) 46. 批量加载 UClass 功能测试批量加载多个同类 UClass 资源 47. 创建单个资源对象测试加载并创建单个 UClass 资源对象 48. 创建同类资源对象 46. 批量加载 UClass 功能 逻…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。下面的题解并不难,你肯定能看懂。 首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的&#xf…

rabbitmq基础-java-3、Fanout交换机

1、简介 Fanout,英文翻译是扇出。 2、 特点 1) 可以有多个队列 2) 每个队列都要绑定到Exchange(交换机) 3) 生产者发送的消息,只能发送到交换机 4) 交换机把消息发送给绑定过的…

3d模型怎么分辨材质?--模大狮模型网

在3D模型中,通常可以通过以下几种方式来分辨材质: 视觉检查:在3D渲染视图或预览窗口中,您可以直接观察模型的外观来区分不同的材质。不同的材质可能具有不同的颜色、纹理、反射率等特征,因此通过直观的视觉检查&#x…

网络通信课程总结(小飞有点东西)

27集 局域网通信:用MAC地址 跨局域网通信:用IP地址(MAC地址的作用只是让我们找到网关) 又因为arp技术,可以通过MAC地址找到IP地址,所以我们可以通过IP地址定位到全世界任意一台计算机。 28集 在数据链路…

C语言每日一题(47)两数相加II

力扣 445 两数相加II 题目描述 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 示例1: 输入&#xff…

了解WPF控件:RadioButton和RepeatButton常用属性与用法(九)

掌握WPF控件:熟练常用属性(九) RadioButton 一种允许用户在一组选项中单选一个的控件。通常用于提供一组互斥的选项供用户选择。 常用属性描述Content用于设置 RadioButton 显示的文本内容。GroupName用于将多个 RadioButton 控件组合到一…

船的最小载重量-算法

说明:题解完全是从leetCode上拉下来的,在这里只是作为一个备份,怕之后找不着了。同时也分享给大家,这个题目用了一个我之前从未遇到的思路。 原题:船的最小载重量-leetCode1101 题目(看懂题目了吗&#xff…

python批量处理修改pdf内容

将PDF转换为Word: 使用pdf2docx库中的Converter类来进行PDF转换。convert_pdf_to_docx函数接受PDF文件路径和输出的Word文档路径作为参数。通过调用Converter对象的convert方法将PDF转换为Docx格式。最后调用close方法关闭Converter对象并保存转换后的文档。 将Word…

QT下载、安装详细教程[Qt5.15及Qt6在线安装,附带下载链接]

QT5.15及QT6的下载和安装 1.下载1.1官网下载1.2国内镜像网站下载 2.安装3.软件启动及测试程序运行3.1Qt Creator(Community) 1.下载 QT自Qt5.15版本后不在支持离线安装包下载(非商业版本,开源),故Qt5.15及Qt6需要使用在线安装程序…

Zephyr 源码调试

背景 调试环境对于学习源码非常重要,但嵌入式系统的调试环境搭建稍微有点复杂,需要的条件略多。本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码,为后续分析 Zephyr OS 相关原理做铺垫。 环境 我的开发环境为 wsl ubuntu&#xf…

使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理 LlamaIndex的文档链接:Using LLMs - LlamaIndex 🦙 0.9.33 LlamaIndex 的一般使用模式如下: 加载文档(手动或通过数据加载器)将文档解析为节点构建索引(来自节点或文档)(可选,高级&…

Java内存模型

主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量包括实例变量、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为局部变…

GreptimeAI + Xinference 联合方案:高效部署并监控你的 LLM 应用

随着人工智能技术的迅速进步,OpenAI 已经崭露头角,成为该领域的领军者之一。它在多种语言处理任务上表现卓越,包括机器翻译、文本分类和文本生成等方面。随着 OpenAI 的兴起,同时涌现的还有许多其他优质的开源大语言模型&#xff…

函数递归(Recursion)一篇便懂

递归的概念 在 C 语言中,递归(Recursion)是一种函数调用自身的编程技术。当一个函数在其定义中调用自身时,就称为递归函数。 了解递归思想 把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解…

OpenAI Altman曝光GPT-5后,你对未来大模型有什么期待?

最近OpenAI首席执行官 Sam Altman 在达沃斯论坛接受媒体采访时表示,他现在的首要任务就是推出下一代大模型,这款模型可能被称为GPT-5,与现有模型相比,GPT-5 “能做更多、更多的事情”。 Altman认为GPT-5仍处于早期阶段&#xff0…

运维神器Ansible的常用模块

引言:话不多说,今天分享一下Ansible的常用模块,建议收藏哦 1、ping模块 ping模块可以进行主机连通性测试 命令格式 ansible 主机或主机组 -m ping 例,成功显示如下: 2、command 模块 command模块可以直接在远程主机…