Java 18 Switch语句更强大了
自Java13以来,Switch表达式被添加到Java核心库中。如果您使用的是Java版本13或更高版本,那么您肯定可以将旧Switch转换为新Switch。
本文将讨论它如何在不破坏现有更改的情况下提供某些功能。当然,其他语言用户可能会评论“多年前,它就已经存在于我们的编程语言中了”。但让我们微笑一下,继续用Java编程,好吗?注意,我将在帖子中交替使用“ switch expression ”和“ switch statement ”,所以请记住,我想说的是同一件事。
旧的Java Switch语句
switch语句将以更可读、更简洁的方式(并非每次)替换单个变量的if-else-if梯形图。是的,我知道,这不是一个精确的定义。
让我们看一个实际的例子。假设你按下了一个按钮,并且有了特定的按钮代码,你需要有一些与之相关的命令。现在,您可以执行第一块中显示的if-else-if梯形图,或者将其转换为第二块中显示的开关表达式:
if(button == 1) {command = "on"; } else if(button == 2){command = "off"; } else if(button == 3 || button == 4) {command = "ring"; } else{throw new RuntimeException("Wrong Button Code"); }
switch表达式:
switch(button){case 1:command = "On";break;case 2:command = "off";break;case 3:case 4:command = "ring";break;default:throw new RuntimeException("Wrong Button Code"); }
正如你所见,这个switch即使我们减少了条件检查,我们也必须添加很多额外的代码,比如break语句。这就是新的Java Switch语句或表达式帮助我们的地方。与其说是一个新的,不如说是一个“更新的开关表达式”。但无论如何,让我们看看。
新的switch语句
在新的switch语句中,您将看到的第一件事是,您根本不必编写 break
语句。要做到这一点,你必须使用箭头 ->
,我们在lambda中使用的箭头,来告诉这个案例的开始。至于实际的代码块,可以将其设置为一行表达式,也可以在代码块周围使用一个花括号。
此外,对于不同case的相同评估,您不需要多次编写case语句,您可以用逗号分隔它们(例如,上例中的case3和case4)。
switch(button){case 1 -> command = "on"; // on linercase 2 -> {// do somethingcommand = "off"; // a block with curly brackets}case 3, 4 -> command = "ring"; // case can be combined with a commadefault -> throw new RuntimeException("Wrong Button Code"); }
看看代码变得多么简洁。不需要额外的中断声明。此外,可以在不重复关键字的情况下组合案例。但等等,不是这样的。关于这个更新的Java switch语句,还有一件事。
Java Switch表达式的收益率
我们可以从switch语句中得到一个结果。简单地说,您只能从开关块返回特定的内容。它对switch语句使用Java13新添加的 yield
关键字。这只不过是对开关的回报。举个例子你会更好地理解。
假设在上面的例子中,我们为每种情况都修改了命令变量。现在,我们可以直接从特定情况返回特定字符串,并将其分配给命令,而不是对同一变量进行变异。你可以同时使用“冒号大小写”或“箭头大小写”。让我们看看如何。
箭头case ->
String command = switch(button){case 1 -> {yield "on"; } case 2 -> {yield "off";}case 3,4 -> { // multiple caseyield "ring";}default -> throw new RuntimeException("Wrong Button Code"); };
冒号case:
String command = switch(button){case 1:yield "on";// no break should be usedcase 2:yield "off";case 3:case 4:yield "ring";default:throw new RuntimeException("Wrong Button Code"); };
使用switch时请记住这几点:
break yield
结论
java的switch语句或表达式不如Kotlin或Scala的switch表达式强大,但我认为我们可以看到它在不久的将来在Java中变得更加强大。在那之前,让我们试着在代码中使用这个东西。
给大家整理了今年来最经典的面试真题100道,每个题目都有详细的解答,收集了java基础、RabbitMQ,微服务、MySQL数据库、Java并发、JVM,Redis、设计模式,Spring / Spring MVC,等专题的经典面试真题,和详细分析。
数据库篇
- 事务四大特性(ACID)原子性、一致性、隔离性、持久性?
- 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
- MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
- MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
- MySQL B+Tree 索引和 Hash 索引的区别?
- sql 查询语句确定创建哪种类型的索引,如何优化查询
- 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
- 数据库的读写分离、主从复制,主从复制分析的 7 个问题?
- MySQL 都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
- MySQL 高并发环境解决方案?
这些问题都是抽取了部分发出来,答案解析和知识点都整理在这个近500页的Java学习笔记文档里了,详细内容有很多,为了不影响阅读,可看整理的《Java架构进阶笔记》可关注下方公众号
Spring篇
- Spring IoC、AOP 原理
- Spring Bean 生命周期
- Spring Bean 注入是如何解决循环依赖问题的
- 怎样用注解的方式配置 Spring?
- Spring 事务为何失效了
- SpringMVC 的流程?
- Springmvc 的优点:
- Spring 通知类型使用场景分别有哪些?
- IoC 控制反转设计原理?
- Spring 如何处理线程并发问题?
JVM篇
- Java 类加载过程?
- 描述一下 JVM 加载 Class 文件的原理机制?
- 简述 Java 垃圾回收机制。
- 什么是类加载器,类加载器有哪些?
- 如何判断一个对象是否存活?(或者 GC 对象的判定方法)
- 垃圾回收的优点和原理。并考虑 2 种回收机制。
- 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
- Java 中会存在内存泄漏吗,请简单描述。
- 简述 Java 内存分配与回收策率以及 Minor GC 和 Major GC。
- Java 中垃圾收集的方法有哪些?
Java并发篇
- Synchronized 用过吗,其原理是什么?
- 为什么说 Synchronized 是非公平锁?
- 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有
- 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。
- 谈谈 ReadWriteLock 和 StampedLock。
- 如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。
- 线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
- 提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比
- 如何在 Java 线程池中提交线程?
- 请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
这些问题都是抽取了部分发出来,答案解析和知识点都整理在这个近500页的Java学习笔记文档里了,
Redis缓存篇
- 什么是 Redis 事务?原理是什么?
- 请介绍一下 Redis 的数据类型 SortedSet(zset)以及底层实现机制?
- Redis 常用的命令有哪些?
- 什么是缓存穿透?怎么解决?
- 什么是缓存雪崩? 怎么解决?
- 请介绍几个可能导致 Redis 阻塞的原因
- 缓存的更新策略有几种?分别有什么注意事项?
- Redis 为什么设计成单线程的?
- Redis 持久化机制 AOF 和 RDB 有哪些不同之处?
- Redis 缓存失效策略有哪些?
RabbitMQ篇
- RabbitMQ 的使用场景有哪些?
- RabbitMQ 有哪些重要的角色?
- RabbitMQ 有哪些重要的组件?
- RabbitMQ 的消息是怎么发送的?
- RabbitMQ 怎么保证消息的稳定性?
- RabbitMQ 怎么避免消息丢失?
- 要保证消息持久化成功的条件有哪些?
- RabbitMQ 有几种广播类型?
- RabbitMQ 怎么实现延迟消息队列?
- RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?
Java集合篇
- ArrayList 和 Vector 的区别
- 说说 ArrayList,Vector, LinkedList 的存储性能和特性
- 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?
- hashmap 的数据结构。
- HashMap 的工作原理是什么?
- Hashmap 什么时候进行扩容呢?
- HashSet 和 TreeSet 有什么区别?
- HashSet 的底层实现是什么?
- LinkedHashMap 的实现原理?
- Collection 和 Collections 的区别。
微服务篇
- 使用Spring Cloud有什么优势?
- 服务注册和发现是什么意思?Spring Cloud如何实现?
- 负载平衡的意义什么?
- 什么是Hystrix?它如何实现容错?
- 什么是Hystrix断路器?我们需要它吗?
- 什么是Netflix Feign?它的优点是什么?
- Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
- Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
- Spring Boot中的监视器是什么?
- 什么是Swagger?你用Spring Boot实现了它吗?
Zookeeper篇
- zk的命名服务(文件系统)
- zk的配置管理(文件系统、通知机制)
- Zookeeper集群管理(文件系统、通知机制)
- Zookeeper分布式锁(文件系统、通知机制)
- 获取分布式锁的流程
- Zookeeper队列管理(文件系统、通知机制)
- Zookeeper数据复制
- Zookeeper工作原理
- zookeeper是如何保证事务的顺序一致性的?
- Zookeeper 下 Server工作状态
解决方案篇
- API接口安全设计
- 秒杀系统设计思路
- 分布式事务解决方案
- SSO单点登录方案
- Redis缓存和MySQL数据一致性方案详解
- 分库分表设计
- 缓存雪崩,穿透,击穿解决方案
最后
对于这些问题我都整理了答案,记录在这个Java学习笔记里,这份笔记包括了Spring,JVM,java基础,Java集合,Java并发编程,微服务,网络,Kafka,分布式,Redis,大厂面试解决方案,分布式事务,设计模式,算法,数据结构,MySQL等
详细内容有很多,为了不影响阅读,可看整理的《Java架构进阶笔记》可关注下方公众号!免费货区
Java 18 Switch语句更强大了相关推荐
- java用switch语句根据分数输出学生等级
java用switch语句根据分数输出学生等级 /*** 从键盘上输入分数,计算等级grade=score/10;* <60,不及格,继续努力!* 60-69,及格,仍需努力!* 70-79,一 ...
- java用switch语句算,Java的switch语句与条件运算符
文章导读 [前面学习了条件结构的if语句,可以解决多条件判断的情况.除了if语句外,Java语言还提供了switch语句和条件运算符用于简化条件判断语句的编写.本篇探讨Java的switch语句和条件 ...
- 解析java当中switch语句的作用和break、continue关键字的用法
解析java当中switch语句的作用和break.continue关键字的用法 A. switch语句 1.含义 是分支结构,使程序按照条件的判断结果去执行相应的程序代码. 2.语法 switch( ...
- Java 10.switch语句
switch语句 switch语句可以是程序从多条执行路径中选择一条来执行,这些路径的选择基于某个单一的值. switch语句先计算一个表达式的值,然后将该值和几个可能的case子句取值进行匹配.每种 ...
- [Java基础]JAVA的SWITCH语句(String)
switch 语句相当于 if else的另一种表达方式 switch 控制表达式支持的类型有byte.short.char.int.enum(Java 5).String(Java 7). 注: 每 ...
- Java程序 switch语句
switch语句 import java.util.Scanner; public class Switchr {public static void main(String args[]){int ...
- Java中switch语句支持的类型
switch语句表达式的取值类型: 基本数据类型:byte,short,int,char JDK5以后可以是枚举 JDK7以后可以是String 不支持long.float.double.boolea ...
- Java语言Switch语句详解(一)
Switch语句概述 1.switch语句称为情况选择语句,又称为开关语句. 2.switch是分支语句的一种,用于对多种情况进行不同处理的语句. 3.JDK1.7 之前的switch语句限定对整形数 ...
- java中switch语句用法详解
1.switch语句的基本语法 int week =**: switch(week){//week为定义的变量 case **://case 之后使用空格再加 满足week的值 执行语句//当满足此c ...
最新文章
- 双击jar运行main主函数实现-fatJAR
- “RPC 好,还是 RESTful 好?” 不要选错了!
- Windows_API_函数 参考大全
- HTTP之100-Continue
- guava api_使用Google Guava的订购API
- Linux高频命令汇总,Linux高频命令
- 无监督学习 | KMeans与KMeans++原理
- 设置时区,时间,日期的脚本
- Golang 25 个保留关键字
- 4207. 最长合法括号子序列
- 题号的随机抽取滚动背景以及题号展示背景如何定制?
- QT表格QTableWidget在win10下纵横表头无分隔线的问题
- 汇编intel 8086/8088/80386 学习
- linux 分区怎样缩小,如何缩小磁盘分区大小
- 站点LOGO开通注意事项,百度LOGO权限开通的技巧
- oracle11 如何启动企业管理器
- CV面试知识点总结--机器学习
- 多设备monkey测试工具_基于Tkinter GUI操作
- PostgreSQL中的io多路复用--select和epoll实现
- Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架