这个Java 21新特性,用过都说好!

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
应用实时监控服务-应用监控,每月50GB免费额度
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 所谓模式类似上图中木盒的各种形状的洞洞,我们的值只有匹配木盒上面的洞洞才能放进去。 我们看到上面的和木盒有很多不同的形状,意味着模式是多种多样的。

这篇文章我们借助新版Java来理解模式匹配,Rust版的模式匹配稍后就端上来,各位先尝尝Java这杯老咖啡还香不香😄。

什么是模式匹配?

下图直观的表达了模式匹配的概念。

image.png

所谓模式类似上图中木盒的各种形状的洞洞,我们的值只有匹配木盒上面的洞洞才能放进去。
我们看到上面的和木盒有很多不同的形状,意味着模式是多种多样的。

模式匹配是一种通用的技术,可以用于匹配各种类型的数据,包括字符串、树、列表等。例如,正则表达式就是一种特殊类型的模式匹配,专门用于匹配字符串。

正则表达式使用一系列特殊字符来定义模式。例如,正则表达式 \d+ 可以匹配任何由一个或多个数字组成的字符串。

我们把模式和匹配分开来看。

Pattern pattern = Pattern.compile("\\d+");
String text = "12345abc67890";

Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
   
   
    System.out.println("The matched substring is: " + matcher.group());
}

// 程序输出:
The matched substring is: 12345
The matched substring is: 67890

这段代码中模式就是Pattern对象,匹配就是Matcher对象。程序运行过程就是,先创建一个模板有一个或多个数字,然后在text字符串中匹配出符合模板的字符串,最后print到标准输出。

理解了模式匹配这个概念以后,我们就来看新版Java中的模式匹配语法。到这里还不懂模式匹配请趴网线敲我。


Java中的模式匹配

Java 中的模式匹配是一种新的语言特性,于 Java 14 中引入。它允许您使用更简洁的语法来检查对象的类型和提取其值。

模式匹配由两个部分组成:

  • 模式:描述要匹配的对象,描述了数据的形状。
  • 绑定变量:用于存储从匹配对象中提取的值。

以下是一个简单的示例:

Object obj = "Hello, world!";

if (obj instanceof String str) {
   
   
  System.out.println(str.toUpperCase());
}

在这个例子中,模式是 String str。它描述了一个类型为 String 的对象。绑定变量是 str,它用于存储从匹配对象中提取的值。

如果 obj 变量引用一个 String 对象,则模式匹配将成功。那么,我们说obj的值是匹配String模式的。然后,str 变量将包含该对象的字符串值。

模式匹配可以用于各种场景,包括:

  • 检查对象的类型
  • 从对象中提取值
  • 将对象转换为不同的类型

以下是一些更高级的模式匹配示例:

  • 类型模式:用于匹配特定类型的对象。
Object obj = 123;

if (obj instanceof Integer i) {
   
   
  System.out.println(i * 2);
}
  • 记录模式:用于匹配具有特定属性的记录。
record Person(String name, int age) {
   
   }

Person person = new Person("John Doe", 30);

if (person instanceof Person(String name, 30)) {
   
   
  System.out.println("Hello, " + name + "!");
}
  • 数组模式:用于匹配数组。
int[] numbers = {
   
   1, 2, 3};

if (numbers instanceof int[] arr && arr.length == 3) {
   
   
  System.out.println("The array contains three elements.");
}

从 Java 17 开始,switch 语句也支持了模式匹配。

Object obj = ...;

String name;

switch (obj) {
   
   
  case Person person:
    name = person.getName();
    break;
  case Company company:
    name = company.getName();
    break;
  default:
    throw new IllegalArgumentException("The object is not a Person or Company");
}

在Java 17之前,我们实现同样的功能需要这样写:

Object obj = ...;

String name;

if (obj instanceof Person) {
   
   
  name = ((Person) obj).getName();
} else if (obj instanceof Company) {
   
   
  name = ((Company) obj).getName();
} else {
   
   
  throw new IllegalArgumentException("The object is not a Person or Company");
}

这段代码看起来不怎么优雅,不过它实现了同样的功能。

总结

从广义上说,模式匹配是一种“设计模式”,不止编程语言,各种领域都有这种思想。从编程语言这个领域来看,它是先定义好模板,然后看数据是否符合这个模板,主要用于需要判断的场景。同时模式匹配不是必须的,它是一种高级的语法糖,即便没有模式匹配,功能也一样能实现。它的好处是提供了一种更加简洁的表达方式。

Java这个老古董都支持模式匹配,在Rust中肯定也支持了,下篇文章我们介绍Rust语言的模式匹配。

目录
相关文章
|
8天前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
43 0
|
3月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
145 2
|
3月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
391 0
|
3月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
74 0
|
3月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
133 1
|
3月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
174 2
|
3月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
112 3