引言

在学习分支语句的时候,我们都学过 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表达式的更多相关文章

  1. Angular6 学习笔记——组件详解之模板语法

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  2. 详解Python 切片语法

    Python的切片是特别常用的功能,主要用于对列表的元素取值.这篇文章主要介绍了详解Python 切片语法,需要的朋友可以参考下 Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片 ...

  3. Java12新特性 -- switch表达式

    传统switch表达式的弊端: 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行: 所有的case语句共用一个块范围,在不同的case语句定义的变量名不能重复: 不能在 ...

  4. LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  5. 详解函数声明VS函数表达式

    函数声明 比方如下:1.我们以一个完整的语句以function开头,不加任何东西. 2.有一个函数名(add) 3.参数可带可不带(x,y) 4.有一个数体 满足以上要求的我们统称为函数声明! 附加小 ...

  6. 【转】详解Java正则表达式语法

    (转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...

  7. (译)详解javascript立即执行函数表达式(IIFE)

    写在前面 这是一篇译文,原文:Immediately-Invoked Function Expression (IIFE) 原文是一篇很经典的讲解IIFE的文章,很适合收藏.本文虽然是译文,但是直译的 ...

  8. MySQL(九)之数据表的查询详解(SELECT语法)二

    上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...

  9. MySQL(九)之数据表的查询详解(SELECT语法)一

    这一篇是MySQL中的重点也是相对于MySQL中比较难得地方,个人觉得要好好的去归类,并多去练一下题目.MySQL的查询也是在笔试中必有的题目.希望我的这篇博客能帮助到大家! 重感冒下的我,很难受!k ...

随机推荐

  1. JUC之Callable接口回顾和JUC辅助类

    Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...

  2. Python_魔法属性和方法

    魔法属性 __doc__:表示类或方法的描述信息 __moudle__:表示当前操作对象的模块,当前模块时,显示__main__ __class__:表示当前操作对象的类型 __name__:表示类或 ...

  3. 华为云 Kubernetes 管理员实训 五 课后作业

    练习1 部署一个Deployment应用,使用secret普通卷,该应用启动依赖此secret. Deployment的名称为<hwcka-005-1-你的华为云id> 将所用命令.创建的 ...

  4. powershell基础知识

    基本命令 我们先从最基本的命令入手,Windows Powershell命令中get类命令是很庞大的一个命令工具集合,而且get类命令也是Powershell中占比最大的. 1.Get-Alias G ...

  5. 读 Linux 像读小说「GitHub 热点速览 v.22.03」

    本周特推选取了一个画风有点意思的 Linux 代码带读项目 flash-linux0.11-talk,希望有趣的文风能带你读完 Linux 代码.当然画风可以增加阅读体验,彩色标记也是一种学习方法-- ...

  6. html,js 获取父窗口元素

    $("#父窗口元素ID",window.parent.document) window.parent.document.getElementById("父窗口元素ID&q ...

  7. 【源码阅读】VictoriaMetrics中理解vm-backup中设置origin地址的用途

    lib/backup/actions/backup.go: // 118 行 partsToCopy := common.PartsDifference(srcParts, dstParts) //要 ...

  8. Cesium入门11 - Interactivity - 交互性

    Cesium入门11 - Interactivity - 交互性 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ ...

  9. Floodlight+Mininet的SDN实验平台搭建初探

    平台环境说明: Cpu:Intel Core 2 Duo T6570 Mem:4.00GB Os :Ubuntu 14.04 1.Floodlight Floodlight是一个比较成熟的sdn控制器 ...

  10. vue学习4-class和sytle绑定

    #### Class绑定: 1. 通过数组的方式来实现: 2. 通过对象的方式来实现: 通过对象: 通过数组,通过数组是把多个style样式对象添加进去: