模式匹配这么好,Java语法里有吗?

news2025/1/12 18:11:25

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

什么是模式匹配?

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

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

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

正则表达式使用一系列特殊字符来定义模式。例如,正则表达式 \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语言的模式匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…

工具分享:在线键盘测试工具

在数字化时代,键盘作为我们与计算机交互的重要媒介之一,其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作,并帮助用户检测潜在的延迟、连点等问题,一款优质的在线键盘测试工具显得尤为重要…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因,系统地阐述智能运维业务所涵盖的各个方面,包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括: 数据不一致或…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

电脑文件msvcr110.dll缺失的多种解决方法,msvcr110.dll文件修复手段

遭遇"程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll"这样的错误提示&#xff0c;是Windows操作系统用户可能会遇到的一种情况。尽管这种现象在一些用户中较为常见&#xff0c;但解决这一问题并非复杂的过程。本文将深入剖析此问题&#xff0c;并分享一些实用的…

2.16日学习打卡----初学Dubbo(一)

2.16日学习打卡 目录: 2.16日学习打卡一. 什么是分布式&#xff1f;二. 什么是RPC?三. Dubbo概念_简介四. Dubbo核心组件五.Dubbo配置开发环境六. Dubbo配置开发环境_管理控制台 一. 什么是分布式&#xff1f; 可以看我的这篇文章–2.14日学习打卡----初学Zookeeper(一) 二.…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis&#xff1f;Hibernate 和 MyBatis的区别&#xff1f;Mybatis的下载和使用Mybatis的工作原理 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

牛客网 OR141 密码检查

答案&#xff1a; #include <stdio.h> #include <string.h> #include <ctype.h> int main() {int n 0;int count1 0, count2 0, count3 0;scanf("%d", &n);while (n--){char ch[100];scanf("%s", ch);int len strlen(ch);if (…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

<el-table :data"Gbtable" border style"width: 100%"><el-table-column prop" date" label"责任方" align"center" ></el-table-column><el-table-column prop"name" label"柜名"…

图片文字编辑软件app分享5个!

在数字化时代&#xff0c;图片和文字的结合已经成为信息传播的重要形式之一。无论是制作精美的海报、设计独特的社交媒体封面&#xff0c;还是简单地为图片添加一些说明性文字&#xff0c;都离不开专业的图片文字编辑软件。今天&#xff0c;就让我们一起探索那些不可错过的图片…

ai自动证件照片制作的软件?分享3款先进工具!

随着科技的发展&#xff0c;我们的生活变得越来越便捷。尤其在图像处理领域&#xff0c;AI技术的应用更是让许多传统行业焕发出新的活力。其中&#xff0c;AI证件照制作工具就是近年来备受瞩目的创新产品。这些工具利用先进的AI技术&#xff0c;帮助用户在家中就能轻松制作出专…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

open3d 点云体素化

open3d 点云体素化 一、算法原理1.从点云到体素化&#xff08;主要函数&#xff09;2.从网格到体素化&#xff08;主要函数&#xff09; 二、代码三、结果1.从点云到体素化2.从网格到体素化 四、相关数据 一、算法原理 点云和三角网格是非常灵活但不规则的几何类型。体素网格是…

互联网大厂职级和薪资一览表!看看WebGIS能到多少级?

以上薪资来源网络&#xff0c;仅供参考。 我们再来看下这些大厂在招的webgis岗位薪资&#xff1a; 01. 华为职级和薪资水平 02. 华为WebGIS薪资 13-26K&#xff0c;经验不限 勉强能够上13级 03. 腾讯职级与薪资 04. 腾讯WebGIS薪资 13-35K&#xff0c;3-5年工作经验 范围挺…

linux系统---firewalld

目录 一、firewalld介绍 1.归入zone顺序 2.firewalld zone分类 3.预定义服务 二、图形化操作 1.打开firewalld图形化界面 2.以http服务为例&#xff0c;打开httpd服务 ​编辑 3.修改端口号 三、命令行配置 1.基础配置 2.查看现有firewalld设置 3.设置查看默认区 4.添…

【算法分析与设计】最大层内元素和

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层&#xff0c;而根节点的子节点位于第 2 层&#xff0c;依此类推。 请返…