前言
相信你在Java编程中用到过如下的操作:
// 调用上游接口.返回结果obj
Object obj = getObj();
// 判断返回值是不是字符串
if (obj instanceof String) {
String objstr = (String) obj;
// do something with objstr
}
以上这种instanceof-and-cast 惯用语的代码基本每个人都写过。这段代码的含义是:
这里有三件事:检查(obj 是 String 吗?)、转换(将 obj 转换为 String)以及声明新的局部变量(objstr),
以便我们可以使用 string 值来操作后续的逻辑。
此模式简单明了,所有 Java 程序员都理解,但由于多种原因,此模式并不理想。这样写很无聊;
应该没有必要同时执行类型测试和强制转换,因为作为正常人来说,你在instanceof检查之后,你还会做除了类型转换的其他事情吗。
同时,特别是 String 类型的三次出现更是混淆了后面更重要的逻辑。上来啥也没干,就写了三个String了,难怪别人说java语言是最繁琐的语言。
但最重要的是,重复写同一个东西为错误提供了机会,这些错误会在不被注意的情况下悄无声息地潜入程序中。繁琐意味着容易出错。
基于以上的问题,java在jdk14中提出了模式匹配的语法机制来解决这个问题。该语法在JEP305中发布,作为第一次预览(preview)java模式匹配。
一、模式匹配的第一次预览
在jep305中发布的第一次模式匹配预览中,我们用他提供的语法来重写一下我们上面的例子。
// 调用上游接口.返回结果obj
Object obj = getObj();
// 判断返回值是不是字符串
if (obj instanceof String objstr) {
// do something with objstr
}
此时我们就看到,之前的1、检查 2、转换 3、创建新的变量 现在背缩减到了一步就完成了。编译通过,测试通过。
那么我们再把这个例子复杂化一点呢。我们增加一点逻辑。
public static void main(String[] args) {
// 调用上游接口
Object obj = getObj();
// 判断返回值是不是字符串
if (obj instanceof String objstr) {
// do something with objstr
System.out.println(objstr.toUpperCase());
<

最低0.47元/天 解锁文章
936

被折叠的 条评论
为什么被折叠?



