详解Java12新增语法switch表达式
引言
在学习分支语句的时候,我们都学过 switch 语句,相比于 if-else 语句,他看起来更加整洁,逻辑更加清晰,Java中当然也给我们提了相关的 switch 方法。但是Java的强大之处在于,他对这一语句结构进行了拓展。在Java 12中,Java新引入了switch表达式Switch Expressions,我们都知道,switch 语句如果漏写一个 break,那么逻辑往往就跑偏了,这种方式既繁琐,又容易出错。那么Switch Expressions为我们提供勾勒出了Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。下面我将对传统的switch语句和switch表达式做出对比,并介绍switch表达式的用法。
对比
例如,根据用户输入的年份和月份,判断这个月一共有多少天,传统switch语句代码如下:
package day_11_25;
import java.time.LocalDate;
import java.util.Scanner;
/**
* @author soberw
*/
public class Switch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year = sc.nextInt();
System.out.print("请输入月份:");
int month = sc.nextInt();
int day = 31;
switch (month) {
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
day = (LocalDate.of(year, month, 1).isLeapYear()) ? 29 : 28;
break;
default:
break;
}
System.out.printf("%d年%d月有%d天%n", year, month, day);
}
}
运行测试:

使用switch表达式后:
package day_11_25;
import java.time.LocalDate;
import java.util.Scanner;
/**
* @author soberw
*/
public class SwitchExpression {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year = sc.nextInt();
System.out.print("请输入月份:");
int month = sc.nextInt();
int day = switch (month) {
case 4, 6, 9, 11 -> 30;
case 2 -> (LocalDate.of(year, month, 1).isLeapYear()) ? 29 : 28;
default -> 31;
};
System.out.printf("%d年%d月有%d天%n", year, month, day);
}
}
运行测试:

用法分析
那么switch语句与switch表达式最大的区别就是switch可以有返回值了,这也就是为什么我用的时候可以"int day = "了,每一个分支只需要决定具体的返回值是什么,不需要考虑如何使用这个值。而全程只需要一次赋值操作。代码整体变得更简洁、紧凑、清晰。
switch表达式也可以使用 : ,在这种情况下,各个分支必须用break关键字返回值。若使用->这种形式就不需要break,但是:和->不可以混合使用
需要注意的是:
switch表达式必须有default,你可以理解为我们在声明变量的时候必须加一个默认值一样
代码块与yield关键字
那么如果我们想加入其他操作呢,比如在上面案例中,当月份是2月时,我除了想要给day赋值,我还想多输出一句“现在是二月!”那这时候就可以使用代码块了,形式如下:
package day_11_25;
import java.time.LocalDate;
import java.util.Scanner;
/**
* @author soberw
*/
public class SwitchExpression2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份:");
int year = sc.nextInt();
System.out.print("请输入月份:");
int month = sc.nextInt();
int day = switch (month) {
case 4, 6, 9, 11 -> 30;
case 2 -> {
//这里是代码块
System.out.println("现在是二月!");
yield (LocalDate.of(year, month, 1).isLeapYear()) ? 29 : 28;
}
default -> 31;
};
System.out.printf("%d年%d月有%d天%n", year, month, day);
}
}
运行结果:

在执行当前分支的时候,如果我们直接返回值,就可以直接写值就行了,但如果我们想在返回值之前再执行其他操作呢,那就必须使用代码块,用{}括起来,最后通过yield关键字将值返回出来就ok了
注意!!!
使用了代码块之后,{}外面一定不要加;(本人已踩坑。。。)
详解Java12新增语法switch表达式的更多相关文章
- Angular6 学习笔记——组件详解之模板语法
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- 详解Python 切片语法
Python的切片是特别常用的功能,主要用于对列表的元素取值.这篇文章主要介绍了详解Python 切片语法,需要的朋友可以参考下 Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片 ...
- Java12新特性 -- switch表达式
传统switch表达式的弊端: 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行: 所有的case语句共用一个块范围,在不同的case语句定义的变量名不能重复: 不能在 ...
- LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- 详解函数声明VS函数表达式
函数声明 比方如下:1.我们以一个完整的语句以function开头,不加任何东西. 2.有一个函数名(add) 3.参数可带可不带(x,y) 4.有一个数体 满足以上要求的我们统称为函数声明! 附加小 ...
- 【转】详解Java正则表达式语法
(转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...
- (译)详解javascript立即执行函数表达式(IIFE)
写在前面 这是一篇译文,原文:Immediately-Invoked Function Expression (IIFE) 原文是一篇很经典的讲解IIFE的文章,很适合收藏.本文虽然是译文,但是直译的 ...
- MySQL(九)之数据表的查询详解(SELECT语法)二
上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...
- MySQL(九)之数据表的查询详解(SELECT语法)一
这一篇是MySQL中的重点也是相对于MySQL中比较难得地方,个人觉得要好好的去归类,并多去练一下题目.MySQL的查询也是在笔试中必有的题目.希望我的这篇博客能帮助到大家! 重感冒下的我,很难受!k ...
随机推荐
- 使用VUE组件创建SpreadJS自定义单元格(一)
作为近五年都冲在热门框架排行榜首的Vue,大家一定会学到的一部分就是组件的使用.前端开发的模块化,可以让代码逻辑更加简单清晰,项目的扩展性大大加强.对于Vue而言,模块化的体现集中在组件之上,以组件为 ...
- JMeter_使用正则和JSON提取器参数化(常用于提取token)
一.使用正则表达式提取器提取token 查看登录响应参数找出token.图中token为 "ticketString": "ccf26b17-a96f-4913-8925 ...
- oracle 之 EXP、IMP 使用简介
注:DOS命令行中执行exp.imp 导出导入ORACLE数据,ORACLE操作者具有相应的权限! 1.1.导出整库或当前用户:关键字:full语法:exp 用户/密码@数据库实例名 file=导出文 ...
- asyncio异步编程
1. 协程 协程不是计算机提供,程序员认为创造 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术,其实就是一个线程实现代码块相互切换执行.例如: def func1(): ...
- js对象方法
Number对象方法 toFixed() 方法 toFixed()方法返回的是具有指定位数小数的数字的字符串表示.例如: var oNumberObject = new Number(68); ale ...
- nefu120梅森素数
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int ...
- CSS中inherit指定继承的使用方法和auto的区别
CSS中的每个属性都有一个特定值"inherit",其含义是指定继承父元素的相应属性,使用inherit一方面在代码上能地表明要继承于父元素的样式属性,另一方面也使子元素继承了那些 ...
- 简述伪共享和缓存一致性MESI
什么是伪共享 计算机系统中为了解决主内存与CPU运行速度的差距,在CPU与主内存之间添加了一级或者多级高速缓冲存储器(Cache),这个Cache一般是集成到CPU内部的,所以也叫 CPU Cache ...
- sql语句操作(详细)
基础部分 查: 查询 SELECT * FROM `veteran_user` /查询表中所有数据 SELECT DISTINCT "name" from veteran SELE ...
- 【linux】Ubuntu20.04使用apt安装tomcat9
Ubuntu20.04使用apt安装tomcat9 前言 系统环境:ubuntu20.04 java版本:openjdk version "11.0.11" 2021-04-20 ...