当前位置:Java -> 如何开始使用 Java 21 中的新模式匹配

如何开始使用 Java 21 中的新模式匹配

Java 21刚变得更简单了!

想写出更干净、更易读的代码吗?深入了解模式匹配,这是一个强大的新功能,让您可以轻松解构和分析数据结构。本文将通过许多示例探索模式匹配,展示它如何简化常规数据处理并保持代码的简洁。

模式匹配示例

模式匹配在两个关键领域表现出色。首先,switch语句的模式匹配功能取代了冗长的if语句链,使您可以优雅地匹配选择器表达式与各种数据类型,包括原始数据类型、对象甚至null。其次,如果您需要检查对象的类型并提取特定数据呢?考虑到这一点,实例表达式的模式匹配功能简化了这一流程,使您可以确认对象是否与某个模式匹配,如果匹配,则方便地提取所需数据。

让我们看看Java代码中更多模式匹配的示例。

使用switch语句进行模式匹配

public static String getAnimalSound(Animal animal) {
    return switch (animal) {
        case Dog dog -> "woof";
        case Cat cat -> "meow";
        case Bird bird -> "chirp";
        case null -> "No animal found!";
        default -> "Unknown animal sound";
    };
}


  • 匹配除整数和字符串之外的类型的选择器表达式
  • 使用类型模式(case Dog dog)同时检查和转换类型
  • 直接在switch块内处理null(case null
  • 使用箭头语法(->)编写简洁的表达式

使用instanceof进行模式匹配

if (object instanceof String str) {
    System.out.println("The string is: " + str);
} else if (object instanceof Integer num) {
    System.out.println("The number is: " + num);
} else {
    System.out.println("Unknown object type");
}


  • 将类型检查和转换结合到单个表达式中
  • 引入模式变量(str,num)来捕获对象的值。
  • 避免显式转换(String str = (String) object

使用原始类型进行模式匹配

int number = 10;
switch (number) {
    case 10:
        System.out.println("The number is 10.");
        break;
    case 20:
        System.out.println("The number is 20.");
        break;
    case 30:
        System.out.println("The number is 30.");
        break;
    default:
        System.out.println("The number is something else.");
}


使用原始类型进行模式匹配并没有引入全新功能,而是简化了在switch语句中处理原始类型时的现有实践。

使用引用类型进行模式匹配

String name = "Daniel Oh";
switch (name) {
    case "Daniel Oh":
        System.out.println("Hey, Daniel!");
        break;
    case "Jennie Oh":
        System.out.println("Hola, Jennie!");
        break;
    default:
        System.out.println("What’s up!");
}


  • 使用引用类型进行模式匹配使代码更易于理解和维护,因为其语法清晰简洁。
  • 通过在一步中结合类型检查和提取,模式匹配减少了与显式转换相关的错误风险。
  • 更具表现力的switch语句:
    • switch语句更加灵活,可以处理更广泛的数据类型和场景。

处理null的模式匹配

Object obj = null;
switch (obj) {
    case null:
        System.out.println("The object is null.");
        break;
    default:
        System.out.println("The object is not null.");
}


  • 在Java 21之前,switch语句如果选择器表达式为null,则会抛出NullPointerException。模式匹配允许单独处理null情况的case null子句,从而优雅地处理这种情况。
  • 通过在switch语句内显式检查null,可以避免潜在的运行时错误,并确保代码更加健壮。
  • 有一个专用的case null子句使代码的意图更清晰,而不是在switch之前需要外部进行null检查。
  • Java的实现旨在不破坏现有代码。如果switch语句没有case null子句,即使存在默认情况,仍会像以前一样抛出NullPointerException

多个模式的模式匹配

List<String> names = new ArrayList<>();
names.add("Daniel Oh");
names.add("Jennie Oh");
for (String name : names) {
    switch (name) {
        case "Daniel Oh", "Jennie Oh":
            System.out.println("Hola, " + name + "!");
            break;
        default:
            System.out.println("What’s up!");
    }
}


  • 与传统switch语句不同,模式匹配考虑了各个情况的顺序。
  • 将执行第一个具有匹配模式的情况。
  • 确保子类型不会出现在超类型之前的模式匹配情况中,避免无法到达的代码。

结论

模式匹配是Java 21中一个强大的新功能,可以使您的代码更简洁、更易读。它在处理复杂数据结构时特别有用,具有以下关键优势:

  • 提高可读性:模式匹配通过将类型检查、数据提取和控制流结合到单个语句中,使代码更易读。这消除了冗长的if-else链和显式转换的需要。
  • 简洁性:通过利用模式匹配处理多个检查和提取的能力,代码变得更简洁。这减少了样板代码,提高了可维护性。
  • 增强类型安全性:模式匹配通过在switch语句或实例表达式中明确检查和可能转换数据类型,来强制类型安全。这降低了由意外对象类型引起的运行时错误的风险。
  • 处理null:模式匹配允许在switch语句内直接处理null情况。这消除了在switch之前进行单独null检查的需要,改善了代码流程,降低空指针异常的机会。
  • 灵活性:模式匹配不仅适用于基本类型。它可以使用记录模式(在Java 14中引入)处理复杂数据结构。这允许对复杂数据对象进行更具表现力的匹配逻辑。
  • 现代化外观和感觉:模式匹配符合现代函数式编程范式,使Java代码更具表现力,与其他使用此功能的语言保持一致。

总的来说,Java 21中的模式匹配简化了数据处理,提高了代码清晰度和可维护性,并增强了类型安全性,为更强大、更友好的编码体验奠定了基础。

推荐阅读: 阿里巴巴面经(43)

本文链接: 如何开始使用 Java 21 中的新模式匹配