Java 14的一个最酷的特性之一是模式匹配。Java 16增加了instanceof模式,而Java 20增加了模式匹配用于switch。那么,这个新特性到底装了什么?下面让我们来深入探讨一下吧!

首先,让我们回顾一下Java switch,他的作用是根据给定的表达式的值从一系列候选中选择一个语句块来执行。通常,switch使用equals方法来比较表达式的值和候选值。这样做虽然简单明了,但是很繁琐也很容易出错。

例如,在以下示例中:

switch (obj.getClass().getSimpleName()) {

case “Integer”:

int i = (Integer) obj;

System.out.println(“The object is an Integer with value: ” + i);

break;

case “String”:

String s = (String) obj;

System.out.println(“The object is a String with value: ” + s);

break;

default:

System.out.println(“The object is of an unknown type”);

}

我们使用getClass().getSimpleName()方法来获取对象的类名,然后使用一个大而难以阅读的switch语句来处理它。这样做比较麻烦,也比较容易犯错。

Java 20的模式匹配可以让我们更简单和可读的写出类似的代码:

switch (obj) {

case Integer i -> System.out.println(“The object is an Integer with value: ” + i);

case String s -> System.out.println(“The object is a String with value: ” + s);

default -> System.out.println(“The object is of an unknown type”);

}

如上所示,使用模式匹配,我们可以在每个case语句中使用箭头(->)来指定处理语句,这样既清晰又简洁。另外,使用默认的关键字(default)指定默认的处理语句,避免出现未知类型的情况。而且,我们还可以使用断言(assert)来验证模式是否匹配例如:

switch (obj) {

case Integer i && i > 0 -> System.out.println(“The object is a positive Integer with value: ” + i);

case String s && s.startsWith(“hello”) -> System.out.println(“The object is a String starting with hello: ” + s);

default -> { assert obj == null; System.out.println(“The object is null”); }

}

如上所示,我们可以在模式中使用断言assert来验证模式是否适用。这样做提高了代码的可读性和可维护性。

总的来说,Java 20模式匹配用于switch是一个重要的改进和强大的新功能,它可以让我们更容易地编写可读性高的代码,并且能够更好的处理类型匹配问题。如果你还没有尝试过使用模式匹配,那么现在就是时候了!

详情参考

了解更多有趣的事情:https://blog.ds3783.com/