Java 21 变得更简单了!
想要编写更简洁、更具可读性的代码?深入了解模式匹配,这是一项强大的新功能,可让您轻松解构和分析数据结构。本文将通过许多示例来探讨模式匹配,展示它如何简化常规数据处理并保持代码简洁。
模式匹配的示例
图案匹配在两个关键领域大放异彩。首先,switch 语句的模式匹配功能取代了长语句链的时代,让您可以优雅地将选择器表达式与各种数据类型(包括基元、对象甚至 null)进行匹配。其次,如果您需要检查对象的类型并提取特定数据怎么办? instance 表达式的模式匹配功能简化了此过程,它允许您确认对象是否与模式匹配,如果匹配,则可以方便地提取所需的数据。if
让我们看一下 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 块 (
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 语句变得更加通用,可以处理更广泛的数据类型和场景。
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 之前,如果选择器表达式为 .模式匹配允许 dedicated 子句正常处理此方案。
NullPointerException
null
case null
通过在 switch 语句中显式检查 null,可以避免潜在的运行时错误,并确保代码更加健壮。
与在切换之前需要外部 null 检查相比,拥有 dedicated 子句可以使代码的意图更加清晰。
case null
Java 的实现旨在不破坏现有代码。如果 switch 语句没有子句,即使存在默认情况,它仍会像以前一样抛出 a。
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 语句不同,模式匹配考虑 case 的顺序。
执行具有匹配模式的第一个 case。
通过确保在模式匹配情况下子类型不会出现在其超类型之前,避免无法访问的代码。
结论
模式匹配是 Java 21 中一项强大的新功能,可以使您的代码更加简洁和可读。它对于处理复杂的数据结构特别有用,具有以下主要优点:
改进的可读性:模式匹配通过将类型检查、数据提取和控制流合并到单个语句中,使代码更具可读性。这消除了对冗长的 if-else 链和显式强制转换的需求。
简洁性:通过利用模式匹配在单个表达式中处理多个检查和提取的功能,代码变得更加简洁。这减少了样板代码并提高了可维护性。
增强的类型安全性:模式匹配通过在 switch 语句或实例表达式中显式检查并可能强制转换数据类型来强制实施类型安全。这降低了由意外对象类型导致运行时错误的风险。
Null 处理:模式匹配允许直接在 switch 语句中显式处理 null 情况。这样就无需在切换之前进行单独的 null 检查,从而改进了代码流并减少了 null 指针异常的可能性。
灵活性:模式匹配超越了基本类型。它可以使用记录模式(在 Java 14 中引入)处理复杂的数据结构。这允许为复杂的数据对象提供更富有表现力的匹配逻辑。
现代外观:模式匹配与现代函数式编程范式保持一致,使 Java 代码更具表现力,并与使用此功能的其他语言保持一致。
总体而言,Java 21 中的模式匹配简化了数据处理,提高了代码的清晰度和可维护性,并增强了类型安全性,从而提供更强大且对开发人员友好的编码体验。