掌握Java 17的利器:Switch语句升级,模式匹配闪耀登场

简介: 掌握Java 17的利器:Switch语句升级,模式匹配闪耀登场

通过下面这个例子再回忆一下 Java 16 中的 instanceof 增强:

Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
  log.info(s);
}

上面这个场景里,Map 中的 Value 值存在不同的类型,所以使用 instanceof 来判断取出的 value 是什么类型,然后根据不同类型来进行处理。那么,接下来继续思考一个问题,如果这个 Map 中的 Value 可能有这几种类型:String、Integer、Double,我们需要对不同类型分别做不同的处理,是不是处理结构要这样写:

if (data.get("key") instanceof String s) {
  log.info(s);
} else if (data.get("key") instanceof Double s) {
  log.info(s);
} else if (data.get("key") instanceof Integer s) {
  log.info(s);
}

面对这样的 if 语句结构,看着是不是很难受?根据以往的经验,是不是这个时候想到用 switch 来改进一下呢?但是再琢磨下,发现这里判断的时候又用到了 instanceof,似乎一下又不好下手了?

于是,在面对这种场景的时候,Java 17switch 做了增强,然后我们就可以这样来写:

switch (data.get("key1")) {
  case String s  -> log.info(s);
  case Double d  -> log.info(d.toString());
  case Integer i -> log.info(i.toString());
  default        -> log.info("");
}

有没有一下变得很简洁呢?

这里的几个重点值得关注:

  1. case 条件中直接涵盖了类型的判断和类型的转换
  2. 每个 case 的处理逻辑用 Lambda 语法来实现,可以免去 break 语句

另外,要注意的是,对于 switch 表达式中模式匹配的功能,JDK 17 中的实现还是 preview 版本,所以了解为主,目前还不推荐用于正式环境,不排除后续有进一步改进的可能。

相关文章
|
10天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
11天前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
3天前
|
存储 前端开发 Java
Java一分钟之-Java GUI设计原则与模式
本文介绍了Java GUI开发的核心设计原则和模式,包括分层架构(MVC)、组件复用、用户体验和代码示例。强调了MVC模式以提高代码可维护性,组件化设计以增强复用性,以及响应式和简洁界面以提升用户体验。同时,提出了常见问题的避免策略,如布局管理、资源释放和国际化支持,建议开发者遵循这些原则以提升GUI应用质量。
23 3
|
4天前
|
Java
Java中的Switch选择语句详解
Java中的Switch选择语句详解
13 0
|
6天前
|
安全 算法 Java
Java多线程基础-15:Java 中 synchronized 的优化操作 -- 锁升级、锁消除、锁粗化
`synchronized`在Java并发编程中具有以下特性:开始时是乐观锁,竞争激烈时转为悲观锁;从轻量级锁升级至重量级锁;常使用自旋锁策略;是不公平且可重入的;不支持读写锁。
18 0
|
6天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
8天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
10天前
|
消息中间件 缓存 Java
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
总体框架: SaaS应用,全浏览器访问 前后端分离,多服务协同 服务可拆分,功能易扩展
23 1
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
|
10天前
|
设计模式 存储 Java
【设计模式】JAVA Design Patterns——Command(事务模式)
【设计模式】JAVA Design Patterns——Command(事务模式)
|
10天前
|
设计模式 Java 程序员
Java中的工厂方法模式
Java中的工厂方法模式
22 0