”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解 Java 中的模式匹配

了解 Java 中的模式匹配

发布于2024-07-31
浏览:752

Understanding Pattern Matching in Java

模式匹配是 Java 中引入的一项强大功能,可让您简化代码并增强代码的可读性。模式匹配最初在 Java 14 中引入用于 instanceof 检查,并在以后的版本中进行了扩展,通过减少样板文件使代码更具表现力和简洁性。

什么是模式匹配?

模式匹配允许您从对象中提取组件并以简洁的方式应用某些条件。它是根据模式检查值的功能,如果匹配成功,则绑定模式中的变量。

模式匹配的好处

  1. 简洁代码:减少样板代码,使您的程序更短且更易于阅读。
  2. 提高可读性:通过使结构更加明显来增强代码的清晰度。
  3. 类型安全:确保变量类型正确,减少运行时错误的可能性。

使用instanceof进行模式匹配

模式匹配最常见的用途之一是使用instanceof 运算符。这是一个例子:

public class PatternMatchingExample {
    public static void main(String[] args) {
        Object obj = "Hello, World!";

        if (obj instanceof String s) {
            System.out.println("The string is: "   s);
        } else {
            System.out.println("Not a string");
        }
    }
}

在此示例中,instanceof 运算符不仅检查 obj 是否为 String,还将其强制转换为 String 并一步将其绑定到变量 s。

使用 Switch 表达式进行模式匹配

模式匹配也与 switch 表达式一起使用,增强了它们的功能和灵活性。这是使用密封类的示例:

public sealed class Shape permits Circle, Rectangle, Square {}

public final class Circle extends Shape {
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double radius() { return radius; }
}

public final class Rectangle extends Shape {
    private final double width, height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double width() { return width; }
    public double height() { return height; }
}

public final class Square extends Shape {
    private final double side;

    public Square(double side) {
        this.side = side;
    }

    public double side() { return side; }
}

public class PatternMatchingWithSwitch {
    public static void main(String[] args) {
        Shape shape = new Circle(5);

        String result = switch (shape) {
            case Circle c -> "Circle with radius "   c.radius();
            case Rectangle r -> "Rectangle with width "   r.width()   " and height "   r.height();
            case Square s -> "Square with side "   s.side();
        };

        System.out.println(result);
    }
}

在此示例中,switch 表达式使用模式匹配来解构 Shape 对象并提取相关数据。

结论

Java 中的模式匹配为您的代码带来了新的表现力和简单性。通过减少样板文件并增强可读性,它允许您编写更干净且更易于维护的程序。无论您是处理复杂的数据结构还是只是想简化类型检查,模式匹配都是 Java 工具包中的一个有价值的工具。

版本声明 本文转载于:https://dev.to/adaumircosta/understanding-pattern-matching-in-java-3f0k?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么 Margin Top 不适用于 CSS 中的内联元素?
    为什么 Margin Top 不适用于 CSS 中的内联元素?
    顶部边距和内联元素在 CSS 中,margin 属性用于定义元素边框之外的间距。然而,在内联元素上使用 margin top 时会出现一个常见问题,特别是在 Firefox 中。问题:为什么内联元素的 margin top 似乎被忽略在 Firefox 中?答案:此行为并非 Firefox 独有,而...
    编程 发布于2024-12-21
  • 如何使用XPath通过CSS类高效定位HTML元素?
    如何使用XPath通过CSS类高效定位HTML元素?
    使用 XPath 按 CSS 类查找元素在网页抓取中,通常需要根据 CSS 类来定位 HTML 元素。 XPath 是一个用于导航 XML 和 HTML 文档的强大工具,它提供了一种实现此目的的方法。考虑一个 HTML 页面,其中的 div 元素具有名为“Test”的类。以下 XPath 查询可用于...
    编程 发布于2024-12-21
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-12-21
  • 为什么 `array_shift()` 会触发“严格标准:只有变量应该通过引用传递”?
    为什么 `array_shift()` 会触发“严格标准:只有变量应该通过引用传递”?
    错误信息“Strict Standards: Only Variables Should Be Passed by Reference”使用 array_shift() 时,可能会报告严格标准如果传递的参数是函数调用的结果,则会发出警告。这种行为看起来不一致,因为它并不总是触发警告。考虑以下代码:$...
    编程 发布于2024-12-21
  • 如何在 Pandas 中进行聚合?
    如何在 Pandas 中进行聚合?
    Pandas 中的聚合如何使用 Pandas 执行聚合?聚合函数会降低返回对象的维度。一些常见的聚合函数包括mean()、sum()、size()、count()、std()、var()和sem()。df1 = df.groupby(['A', 'B'], as_index=False)['C']....
    编程 发布于2024-12-21
  • 如何在 C++ 中初始化静态 `const std::string` 数据成员?
    如何在 C++ 中初始化静态 `const std::string` 数据成员?
    声明 const std::string 类型的静态数据成员在 C 中,直接在类定义中初始化 const std::string 类型的静态数据成员是不允许。相反,有两个选项可以定义此类数据成员:内联变量(C 17 或更高版本)使用内联变量,它定义并初始化类定义中的静态成员:class A { pr...
    编程 发布于2024-12-21
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-21
  • 如何在 Python 中从函数内部获取函数名称?
    如何在 Python 中从函数内部获取函数名称?
    从函数内部访问函数名称在 Python 中,从函数本身内部确定函数名称在动态自省的情况下非常有用inspect 模块提供了一种方便的机制来获取有关正在运行的程序代码的信息。使用inspect.stack(),我们可以访问表示当前调用堆栈的帧列表。对于给定的函数,堆栈列表中的第一帧对应于当前函数,而第...
    编程 发布于2024-12-21
  • 如何将电子表格列索引号转换为其等效字母?
    如何将电子表格列索引号转换为其等效字母?
    将电子表格列索引转换为字母在 Google 表格中,列用数字索引,从 1 开始。但是,为了方便起见,它们通常也使用字母来表示(例如,“A”表示第一列,“D”表示第四列)。数字索引和字母值之间的转换通常是脚本任务所必需的。实现此转换的一种方法是通过以下函数:function getColumnLett...
    编程 发布于2024-12-21
  • 为什么 `reader.ReadString` 不删除初始分隔符?
    为什么 `reader.ReadString` 不删除初始分隔符?
    reader.ReadString 不会去掉初始分隔符为了创建一个程序来迎接名为 Alice 或 Bob 的用户,开发人员遇到一个问题,即使是合法的名称也会引发不受欢迎的响应。程序错误地拒绝了 Alice 和 Bob 的进入。问题该问题源于程序中使用 reader.ReadString('\...
    编程 发布于2024-12-21
  • 如何通过ServletContext访问WAR/WEB-INF目录下的资源?
    如何通过ServletContext访问WAR/WEB-INF目录下的资源?
    通过ServletContext访问WAR/WEB-INF目录中的资源简介: Java Web 应用程序通常将重要资源存储在 WAR/WEB-INF 目录中。要访问这些资源,开发人员可以利用 ServletContext API。问题:如何创建位于 WAR/WEB-INF 中的资源的正确路径文件夹,...
    编程 发布于2024-12-21
  • 如何使用 Bootstrap 隐藏响应式布局中的元素?
    如何使用 Bootstrap 隐藏响应式布局中的元素?
    使用 Bootstrap 隐藏响应式布局中的元素设计响应式布局时,管理空间变得至关重要,尤其是在较小的屏幕上。 Bootstrap 为移动设备提供了对折叠菜单栏项目的支持,但是如果您想类似地隐藏其他页面元素怎么办?解决方案:Bootstrap 提供了允许您的类根据屏幕尺寸隐藏元素:超小型设备: 手机...
    编程 发布于2024-12-21
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-21
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-21
  • 如何修复嵌入式Python中的“Py_Initialize:无法加载文件系统编解码器”错误?
    如何修复嵌入式Python中的“Py_Initialize:无法加载文件系统编解码器”错误?
    解决嵌入式 Python 中的“Py_Initialize:无法加载文件系统编解码器”错误尝试将嵌入式 Python 3.2 解释器集成到对于 C 应用程序,可能会出现指示“无法加载文件系统编解码器”的错误。当 Py_Initialize 函数无法注册编解码器搜索函数时,会出现此错误。要解决此问题,...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3