Java 17 中 Switch 的模式匹配

发布:2024-10-08 23:17 阅读:34 点赞:0

一. 引言

在这篇文章中,我们将学习 Java 17 中一个非常重要的功能——模式匹配(Pattern Matching)在 Switch 语句中的应用。Java 17 引入了一个令人兴奋的特性,即模式匹配增强了 Switch 语句和表达式。这一增强功能建立在早期版本中引入的模式匹配能力之上,使 Switch 结构变得更加强大和富有表现力。

二. 什么是模式匹配?

模式匹配允许你在一行代码中测试对象是否匹配特定模式或从中提取信息。这个特性能够简化代码的编写,使代码更简短易读,尤其是在处理复杂数据结构时。

三. 基本语法

模式匹配的 Switch 语法基本如下:

switch (obj) {
    case Pattern1 matchedVariable1 -> // 示例代码
    case Pattern2 matchedVariable2 -> // 示例代码
    default -> // 示例代码
}
  • 这段代码展示了如何使用模式匹配语法来匹配对象。

四. 类型模式

我们来看一个示例,展示如何使用类型模式:

public static String getObjectType(Object obj) {
    return switch (obj) {
        case Integer i -> "It's an Integer: " + i; // 如果 obj 是 Integer 类型
        case String s -> "It's a String: " + s;   // 如果 obj 是 String 类型
        case Double d -> "It's a Double: " + d;   // 如果 obj 是 Double 类型
        case null -> "It's null";                   // 如果 obj 是 null
        default -> "It's something else";           // 其他情况
    };
}

public static void main(String[] args) {
    System.out.println(getObjectType(42));              // 输出: It's an Integer: 42
    System.out.println(getObjectType("Hello"));         // 输出: It's a String: Hello
    System.out.println(getObjectType(3.14));            // 输出: It's a Double: 3.14
    System.out.println(getObjectType(null));             // 输出: It's null
    System.out.println(getObjectType(new ArrayList<>())); // 输出: It's something else
}

输出

It's an Integer: 42
It'
s a String: Hello
It's a Double: 3.14
It'
s null
It's something else
  • 在上述示例中,我们使用类型模式来匹配不同类型的对象。Switch 语句自动将对象转换为匹配的类型,使我们可以在 case 块中直接使用。

五. 条件表达式

Java 17 还允许在模式匹配中使用条件表达式。以下是一个示例:

public static String categorizeNumber(Object obj) {
    return switch (obj) {
        case Integer i when i < 0 -> "Negative integer"// 负整数
        case Integer i when i > 0 -> "Positive integer"// 正整数
        case Integer i -> "Zero";                          // 零
        case Double d when d < 0 -> "Negative double";    // 负浮点数
        case Double d when d > 0 -> "Positive double";    // 正浮点数
        case Double d -> "Zero double";                    // 零浮点数
        default -> "Not a number";                         // 其他情况
    };
}

public static void main(String[] args) {
    System.out.println(categorizeNumber(-5));           // 输出: Negative integer
    System.out.println(categorizeNumber(0));            // 输出: Zero
    System.out.println(categorizeNumber(3.14));         // 输出: Positive double
    System.out.println(categorizeNumber("42"));         // 输出: Not a number
}

输出

Negative integer
Zero
Positive double
Not a number
  • 这个例子展示了如何使用守护模式为 case 添加附加条件。

六. 总结

Java 17 中的模式匹配增强了 Switch 语句的功能,使代码更具可读性和表现力。尤其在处理复杂对象层次结构、密封类和记录时,它显得尤为有用。通过结合类型模式、守护模式和记录模式,你可以编写出更简洁、可维护的代码。