Java 18 Switch语句更强大了

743 篇文章 3 订阅
742 篇文章 2 订阅

自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 liner
    case 2 -> {
        // do something
        command = "off"; //  a block with curly brackets
    }
    case 3, 4 -> command = "ring"; //  case can be combined with a comma
    default -> 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 case
        yield "ring";
    }
    
    default -> throw new RuntimeException("Wrong Button Code");
};

冒号case:

String command = switch(button){
    case 1:
        yield "on";
        // no break should be used
    case 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,等专题的经典面试真题,和详细分析。

数据库篇

  1. 事务四大特性(ACID)原子性、一致性、隔离性、持久性?
  2. 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
  3. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
  4. MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
  5. MySQL B+Tree 索引和 Hash 索引的区别?
  6. sql 查询语句确定创建哪种类型的索引,如何优化查询
  7. 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
  8. 数据库的读写分离、主从复制,主从复制分析的 7 个问题?
  9. MySQL 都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
  10. MySQL 高并发环境解决方案?
这些问题都是抽取了部分发出来,答案解析和知识点都整理在这个近500页的Java学习笔记文档里了,详细内容有很多,为了不影响阅读,可看整理的《Java架构进阶笔记》可关注下方公众号

Spring篇

  1. Spring IoC、AOP 原理
  2. Spring Bean 生命周期
  3. Spring Bean 注入是如何解决循环依赖问题的
  4. 怎样用注解的方式配置 Spring?
  5. Spring 事务为何失效了
  6. SpringMVC 的流程?
  7. Springmvc 的优点:
  8. Spring 通知类型使用场景分别有哪些?
  9. IoC 控制反转设计原理?
  10. Spring 如何处理线程并发问题?

JVM篇

  1. Java 类加载过程?
  2. 描述一下 JVM 加载 Class 文件的原理机制?
  3. 简述 Java 垃圾回收机制。
  4. 什么是类加载器,类加载器有哪些?
  5. 如何判断一个对象是否存活?(或者 GC 对象的判定方法)
  6. 垃圾回收的优点和原理。并考虑 2 种回收机制。
  7. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
  8. Java 中会存在内存泄漏吗,请简单描述。
  9. 简述 Java 内存分配与回收策率以及 Minor GC 和 Major GC。
  10. Java 中垃圾收集的方法有哪些?

Java并发篇

  1. Synchronized 用过吗,其原理是什么?
  2. 为什么说 Synchronized 是非公平锁?
  3. 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有
  4. 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。
  5. 谈谈 ReadWriteLock 和 StampedLock。
  6. 如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。
  7. 线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
  8. 提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比
  9. 如何在 Java 线程池中提交线程?
  10. 请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
这些问题都是抽取了部分发出来,答案解析和知识点都整理在这个近500页的Java学习笔记文档里了,

Redis缓存篇

  1. 什么是 Redis 事务?原理是什么?
  2. 请介绍一下 Redis 的数据类型 SortedSet(zset)以及底层实现机制?
  3. Redis 常用的命令有哪些?
  4. 什么是缓存穿透?怎么解决?
  5. 什么是缓存雪崩? 怎么解决?
  6. 请介绍几个可能导致 Redis 阻塞的原因
  7. 缓存的更新策略有几种?分别有什么注意事项?
  8. Redis 为什么设计成单线程的?
  9. Redis 持久化机制 AOF 和 RDB 有哪些不同之处?
  10. Redis 缓存失效策略有哪些?

RabbitMQ篇

  1. RabbitMQ 的使用场景有哪些?
  2. RabbitMQ 有哪些重要的角色?
  3. RabbitMQ 有哪些重要的组件?
  4. RabbitMQ 的消息是怎么发送的?
  5. RabbitMQ 怎么保证消息的稳定性?
  6. RabbitMQ 怎么避免消息丢失?
  7. 要保证消息持久化成功的条件有哪些?
  8. RabbitMQ 有几种广播类型?
  9. RabbitMQ 怎么实现延迟消息队列?
  10. RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?

Java集合篇

  1. ArrayList 和 Vector 的区别
  2. 说说 ArrayList,Vector, LinkedList 的存储性能和特性
  3. 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?
  4. hashmap 的数据结构。
  5. HashMap 的工作原理是什么?
  6. Hashmap 什么时候进行扩容呢?
  7. HashSet 和 TreeSet 有什么区别?
  8. HashSet 的底层实现是什么?
  9. LinkedHashMap 的实现原理?
  10. Collection 和 Collections 的区别。

微服务篇

  1. 使用Spring Cloud有什么优势?
  2. 服务注册和发现是什么意思?Spring Cloud如何实现?
  3. 负载平衡的意义什么?
  4. 什么是Hystrix?它如何实现容错?
  5. 什么是Hystrix断路器?我们需要它吗?
  6. 什么是Netflix Feign?它的优点是什么?
  7. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
  8. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
  9. Spring Boot中的监视器是什么?
  10. 什么是Swagger?你用Spring Boot实现了它吗?

Zookeeper篇

  1. zk的命名服务(文件系统)
  2. zk的配置管理(文件系统、通知机制)
  3. Zookeeper集群管理(文件系统、通知机制)
  4. Zookeeper分布式锁(文件系统、通知机制)
  5. 获取分布式锁的流程
  6. Zookeeper队列管理(文件系统、通知机制)
  7. Zookeeper数据复制
  8. Zookeeper工作原理
  9. zookeeper是如何保证事务的顺序一致性的?
  10. Zookeeper 下 Server工作状态

解决方案篇

  1. API接口安全设计
  2. 秒杀系统设计思路
  3. 分布式事务解决方案
  4. SSO单点登录方案
  5. Redis缓存和MySQL数据一致性方案详解
  6. 分库分表设计
  7. 缓存雪崩,穿透,击穿解决方案

最后

对于这些问题我都整理了答案,记录在这个Java学习笔记里,这份笔记包括了Spring,JVM,java基础,Java集合,Java并发编程,微服务,网络,Kafka,分布式,Redis,大厂面试解决方案,分布式事务,设计模式,算法,数据结构,MySQL等

详细内容有很多,为了不影响阅读,可看整理的《Java架构进阶笔记》可关注下方公众号!免费货区
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值