尝鲜Java 12新特性:switch表达式

Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP。其中对Java语法的改进是JEP 325: switch表达式。于是我迫不及待,提前感受一下更先进的语言特性。

因为12没有正式发布,本文使用自己编译的OpenJDK。嫌麻烦的话,也可以直接使用官方的ea版本。JEP325是预览(preview)特性,编译运行时需要添加--enable-preview参数。

顾名思义,这个feature是对switch动手脚的。包括两个方面。

1. 简化fall-through规则

下面这样的switch代码我们写过几万遍了

switch (today) {
    case SATURDAY:
    case SUNDAY:
        System.out.println("I'm happy!");
        break;
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        System.out.println("I'm sad...");
        break;
    default:
        System.out.println("I'm confused.");
}

这段代码存在的问题是:

1. 内容不符合爱岗敬业的核心价值观(敲黑板!重要!!)
2. 多个条件对应相同代码时(比如MONDAY到FRIDAY),要重复写多个case,冗余且丑陋
3. 每一段代码后面都要有break,一旦忘记就会有编译器检测不到的逻辑错误
4. 变量作用域混乱

第四个问题可能长被忽略。case或者default后面是一连串的语句,而不是代码块(注意,它是没有大括号的)。这种情况下定义的局部变量,其作用域不是case后的部分,而是整个switch结构。因此,下面的代码无法通过编译。

switch (today) {
    case MODAY:
        int x = 1;
        break;
    default:
        int x = 0; //Variable x is already defined in the scope
}

编译器看到的是在一个作用域中存在两个x,非常违背人类的直觉。

上面的四个问题,除了1,剩下的万恶之源就是fall-through规则。即switch结构在找到第一个匹配的case条件后,会顺序执行后面所有case对应的代码,无论是否判断为真。这是40多年前C语言创造后来Java原样照抄的经典语法,但在今天看起来就显得很呆萌了,新的语言也几乎都放弃了fall-through。

好在,尽管后知后觉,从12开始Java开发者也可以选择更简洁清晰的语法了。就像这样

switch (today) {
    case SUNDAY, SATURDAY -> System.out.println("I'm happy!");
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> System.out.println("I'm happy, too!!");
    default -> System.out.println("I'm confused.");
}

很容易看出语法的变化,这些变化也解决了上面的四个问题。归纳一下:

1. 程序内容积极向上,体现了新时代的奋斗精神(敲黑板!重要!!)
2. 对应相同动作的多个case合并为一行,代码更简洁
3. 条件和动作之间用->连接,这时fall-through规则失效。匹配到的分支代码执行完后直接跳出,不会继续执行下面的case对应的代码。也就是不需要再为每一个分支写break了。程序更简洁清晰,也更符合人类的直觉。
   需要注意,为了保持向后兼容性,case条件后依然可以使用:,这时fall-through还是有效的,即不能省略原有的break。而一个switch结构里不能混用->:,否则会有编译错误。
4. 每一个->后面只允许接一个表达式、一个代码块、或者一个throw语句。这样在代码块中定义的局部变量,其作用域就限制在代码块中,而不是蔓延到整个switch结构。逻辑更加清楚了。

2. switch作为表达式(expression)

switch结构一直是一个statement,而从Java 12开始,它也可以用作expression。从学院派的定义理解statement和expression的区别叫人头疼,如果说人话的话,就是switch可以有返回值了。

作为statement的switch没有返回值,所以我们不能写出这样的代码

x = switch (y) { ... }

如果需要根据不同的条件给某个变量赋值,我们以前只能这样做

String word = "";
switch (num) { case 1: word = "One"; break; case 2: word = "Two"; break; default: String result = String.format("Other (%d)", num); word = result; }

让人难受的地方有两个。

1. 重复多次地写赋值语句,繁琐且易错。
2. 这段程序的终极目标是为word变量赋值,而赋值前必须在其他的地方初始化word,淡化了二者的逻辑关系,代码也显得琐碎。

从12开始我们可以这样改造代码

String word = switch (num) {
    case 1 -> "One";
    case 2 -> "Two";
    default -> {
        String result = String.format("Other (%d)", num);
        break result;
    }
};

可见,switch成了一个表达式(expression),它有自己的返回值。每一个分支只需要决定具体的返回值是什么,不需要考虑如何使用这个值。而全程只需要一次赋值操作。代码整体变得更简洁、紧凑、清晰。

而返回值又有两种写法。还记得吗,上一节提到过,->后只能接三样东西:表达式、代码块、throw语句。throw的情况没有返回值,先不管它。另外两种情况:

1. 如果分支只有一个表达式,那么表达式本身就是switch的值,比如上面例子里的"One""Two"
2. 如果分支是一个代码块,比如例子中的default,可以看到Java 12改造了break关键字,可以通过break result的形式返回值。switch并没有抛弃break,而是赋予它更重要的职能。

作为expression的switch也可以使用:,在这种情况下,各个分支必须用break关键字返回值。像这样

String word = switch (num) {
    case 1 : break "One";
    case 2 : break "Two";
    default : {
        String result = String.format("Other (%d)", num);
        break result;
    }
};

上面例子中,case 1case 2中的break不能省略,否则会有编译错误。

很显然,当switch用作expression时,每一个分支都必须有返回值(或者有throw异常)。我们不能写下面这样的代码

String word = switch (num) {
    case 1 -> "One";
    case 2 -> "Two";
    default -> {
        System.out.println("莫挨老子");
        //错误: switch rule completes without providing a value
    }
};

编译器不知道当num=3的时候应该返回什么,于是它愤怒地抛出了一个错误。

最后要强调,switch在不返回值的时候,还是一个statement。而作为expression并且在一句代码的结尾处时,不要忘了后面的分号!(亲自踩坑,友情提醒)

To be continue...

可能你会觉得这些改进还是小修小改,不值得过分激动。但是,JEP 325是JEP 305: Pattern Matching的依赖。虽然没有最终确定,但或许Pattern Matching会在不久后的几个版本正式引入,到时又将是语言层面的大革命。后续的几个版本还是值得期待的。

转载于:https://www.cnblogs.com/tjxing/p/10306772.html

Java 12~14 新特性 Java 12 至 14 通过引入 Switch 表达式、文本块、Records(数据类)、模式匹配 instanceof 等简化代码结构,优化 ZGC/G1 垃圾回收性能,增强空指针异常信息,并支持跨平台工具(如 jpackage),显著提升了开发效率、运行时性能及调试体验,同时为未来版本奠定新特性基础。 阅读详情

相关推荐

Dify 第 10 篇 Dify 知识库手把手案例

本文介绍了如何利用Dify平台构建《阿里巴巴Java开发手册》智能助手。首先详细讲解了知识库创建的完整流程,包括文档上传、分段设置(推荐父子分段+段落上下文)、索引方式选择(高质量+混合检索)等关键步骤。随后指导用户进行分段质量检查和召回测试,强调TopK和Score参数的调优策略。接着演示了Chatflow应用开发过程,通过知识检索节点和LLM节点的配置,实现从知识库智能获取答案的功能。最后展示了应用发布和实际使用效果,成功实现了基于知识库的问答交互。案例采用DeepSeek-R1大模型,并支持答案引用显

甘蓝的专栏 1667

java-switch表达式

二、Switch表达式 三、区别 1、switch 代码块出现在了赋值运算符的右侧;2、一个 case 语句,可以处理多个情景;3、新的情景操作符,“->”,它是一个箭头标识符;4、箭头标识符右侧的数值。这个数值,代表的就是该匹配情景下,switch 表达式的数值。需要注意的是,箭头标识符右侧可以是表达式、代码块或者异常抛出语句,而不能是其他的形式;5、yield 语句产生的值看成是 switch 表达式的返回值。所以,yield 只能用在 switch 表达式里。...

一起coding,一起嗨。 2313

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 206

第18.6.5章 JDK12-17的新特性switch表达式、模式匹配

JAVA 2023 学习笔记 原视频为B站尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备) https://www.bilibili.com/video/BV1PY411e7J6

JOKER的博客 1657

javaswitch条件语句的用法、switch的三种语法、switch支持的参数类型

javaswitch条件语句的用法、switch的三种语法、switch支持的参数类型

weixin_49114503的博客 3万+

java基础概念07-switch语句

switch语句

qq_31532983的博客 1885

java switch 表达式_尝鲜Java 12新特性switch表达式

Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP。其中对Java语法的改进是JEP 325: switch表达式。于是我迫不及待,提前感受一下更先进的语言特性。因为12没有正式发布,本文使用自己编译的OpenJDK。嫌麻烦的话,也可以直接使用官方的ea版本。JEP325是预览(preview)特性,编译运行时需要添加--enable-preview参数...

weixin_33364627的博客 323

java12java12新特性switch表达式

Java12引入了对switch语句的增强,允许在switch语句中使用表达式来代替传统的语句列表。这样可以使得代码更加简洁和易读。switch表达式也是作为预览语言功能的第一个语言改动被引入新版Java中来的,这是一种引入新特性的测试版的方法。通过这种方式,能够根据用户反馈进行升级、更改,如果没有被很好的接纳,则可以完全删除该功能。预览功能的没有被包含在JavaSE规范中。也就是说:这不是一个正式的语法,是暂时进行测试的一种语法。

morris 1万+

详解Java 12新特性switch表达式

原文:http://www.cnblogs.com/tjxing/p/10306772.html Java 12将在两个月后(2019/3/19)发布,其中对Java语法的改进是JEP 325: switch表达式。我迫不及待,提前感受一下更先进的语言特性。顾名思义,这个feature是对switch动手脚的。包括两个方面。 1. 简化fall-through规则 下面这样的switch代码...

shadow_zed的博客 6987

Java 17 新特性— 模式匹配 的Switch 表达式

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 1942

Java 12 新特性Switch 表达式

为了解决 Switch 的现存问题,Java 12 引入全新的Switch 表达式,该表达式不仅增强了 Switch 语句的功能,还大幅提高了其灵活性和表达能力。通过下面一个例子来说明新的 Switch 表达式和老的 Switch 之间的差异,从这些差异中就可以看出 Java 12 中的 Switch 表达式的增强不分。Switch 语句,这是 Java 入门中控制流程的部分,它是除 if 语句外的另外一种条件判断,提供了比连续的。这减少了代码的复杂性,也降低了编程错误的风险。操作符,用于替代传统的冒号(

smart_an的专栏 1186

JavaSe】高级特性篇(十五) Java12新特性Switch表达式

JavaSe·高级特性篇(十五) Java12新特性Switch表达式 前言:JDK12发布 2019年3月20日,Java 12 正式发布了 新特性Switch Expressions 这是一个为开发者准备的特性,我们可以利用具体代码快速了解一下,下面是传统 statement 形式的 switch 语法: switch (day) { case MONDAY: case FRID...

不想当架构师的程序员不是好程序员 990

Java 12 新特性

导读:Java 12 终于发布了,我们一起来看一看 Java 12 中的新特性。通过本文可以在5分钟内快速了解 Java 12 新特性。 1 Switch 表达式 使用Java 12switch不仅可以作为语句也可以作为表达式。 无论作为语句或者作为表达式switch都可以使用传统/简化的作用域和控制流行为。 这将有助于简化代码,并为在switch中使用模式匹配铺平道路。 Java开发人...

oldshaui的博客 2万+

idea switch case快捷键_JDK 14的新特性:switch表达式

简介switch新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Switch Expressions (Standard)。其实Switch新增的功能有两个,一个就是可以连写case,一个就是switch可以带返回值了。写在前面就在我兴致勃勃的想要创建一个以switch命名的package的时候,突然间发现在IDEA中居然创建不...

weixin_39566493的博客 3409

Java17 switch表达式

Java 17关于switch新增一些便利的写法。本文是基于谷歌翻译后调整的译文。

与望 8195

Java中的switch语句详解

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!语句在实际开发中有广泛的应用,例如在处理菜单选项、解析用户输入、实现状态机等方面非常有用。下面是一个实际应用的例子:根据用户输入执行不同的操作。语句的表达式可以是整数类型、枚举类型、字符类型或字符串类型。语句是Java中的一种多分支选择结构,用于简化大量的。标签的值来决定程序的执行路径。语句来根据用户输入的运算符执行相应的计算操作。的值来决定输出哪一天的名字。的值来决定输出不同的信息。

技术研究中心 4469

Day714. switch表达式 -Java8后最重要新特性

了解了 switch 表达式和改进的 switch 语句。讨论了 switch 表达式带来的新概念和新的关键字,了解了这些基本概念以及它们的适用范围。新的 switch 形式、语句和表达式,不同的使用范围,这些概念交织在一起,让 switch 的学习和使用都变成了一件有点挑战性的事情。箭头标识符的引入,简化了代码,提高了编码效率。可是,学习这么多种 switch 的表现形式,也增加了我们的学习负担。不同的 switch 表达形式,以及它们支持的特征,放在了下面这张表格里。

阿昌爱Java 2716

JavaSwitch语句解析

如果你前面已经学过if语句的话,你会发现if语句在多重嵌套下,会显得非常凌乱,代码的可读性也非常差。所以switch语句也可以实现if语句相同的功能,只不过在多重判断下,运用switch语句会是代码更加简洁。

qq_74400992的博客 6970

Java面试题:解释Java 12中的Switch表达式及其优势

Java 12引入了一个预览特性,即Switch表达式Switch Expressions),这是对传统Switch语句的增强。Switch表达式提供了一种更简洁、更灵活的方式来处理多个分支的情况,它允许将结果直接作为表达式返回,而不仅仅是执行一系列的语句。

码农超哥的博客 528

Javaswitch的四种用法

介绍了Javaswitch用法详解,通过示例代码介绍的非常详细,需要的进来学习

m0_74814063的博客 1万+

NVIDIA Display Mode Selector Tool

警告!警告!操作此工具会更新板上的固件,如果你不知道自己在做什么,又使用了该工具,你最终可能会得到一台无显示的机器,可能会使你的设备无法使用。NVIDIA 显示模式选择器是 NVIDIA A40、NVIDIA RTX A5000、NVIDIA RTX A5500 和 NVIDIA RTX A6000 的专用工具,用于为这些显卡设置所需的显示模式。GPU需要处于DC模式才能支持 vGPU,即headless模式像A6000 是工作站 GPU,因此需要用本工具来进行模式转换,设置为Displayless modeWindows 命令:.\displaymodeselector.exe --gpumodeLinux 命令:./displaymodeselector --gpumode1 Physical_display_disabled Displayless mode使用nvidia-smi -q 检查 BAR1 大小nvidia-smi -i 0 -q | grep -i display 检查显示模式

下一篇: Java数组协变与范型不变性
an1988565
博客等级 码龄12年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值