Java 14中的instanceof模式匹配

instanceof运算符的用法就像Java 14中的Pattern Matching一样具有魅力。它使您的代码易于编写和编写。

在本文中,我将介绍什么是instanceof模式匹配以及如何使用它。 让我们开始吧。

为什么我们需要

作为Java开发人员,您经常读取或编写使用instanceof运算符将引用变量与类型进行比较的代码。 如果结果为true ,则下一步是将其显式转换为与之比较的类型,以访问其成员。 这些步骤在这里有明显的重复,例如compare-ifTrue-cast。

这是一个没有为instanceof使用模式匹配的代码instanceof

void outputValue(Object obj) {
    if (obj instanceof String) {            	// comparison
        String s = (String) obj;              	// New variable & explicit casting
        System.out.println(s.toUpperCase());  	// access member
    }
}

让我们看看模式匹配如何帮助删除冗余代码。

什么是

Java 14中的instanceof模式匹配引入了instanceof运算符的模式变量。 如果instanceof条件为true,则模式变量将绑定到要比较的变量,从而避免了显式强制转换以使用其成员的需要。

在IntelliJ IDEA 2020.1中,您可以在变量s上调用上下文相关操作(通过使用Alt + Enter或单击黄色灯泡),然后选择“用模式变量替换' s ”,以在Java 14中使用模式匹配:

Java
前面的操作将修改代码,如下所示:

Java
我突出显示了模式变量s (在第5行),该变量在类型' String '之后添加。 这样可以避免在定义新变量或将其显式转换为String之前可以调用方法toUpperCase()

IntelliJ IDEA 2020.1支持Java 14的所有新功能,包括模式匹配。 参加它的抢先体验计划(EAP),并免费下载其Ultimate Edition。

还请参见:

模式变量的范围

模式变量的范围是有限的。 如果尝试在else块中访问它,则会收到错误消息:

Java
可能会引起混淆,但是如果类PatternMatching类定义了一个实例或静态变量,其名称与模式变量( s )相同,则将编译前面的代码。 在这种情况下, else块中的“ s ”不会引用if块中引入的模式变量。

简化条件表达式

模式匹配的简单性可能具有欺骗性。 这是一个示例,说明开发人员如何定义方法equals()来确定其类的实例是否相等:

package com.jetbrains;
public class Keyboard {
    String model;
    double price;

    @Override
    public boolean equals(Object obj){
        if (obj instanceof Keyboard) {
            Keyboard other = (Keyboard) obj;
            if (model.equals(other.model) && price == other.price) {
                return true;
            }
        }
        return false;
    }
}

这就是可以通过对instanceof使用模式匹配来简化equals()方法的方法:

@Override
    public boolean equals(Object obj){
        return (obj instanceof Keyboard other && 
                model.equals(other.model) && 
                price == other.price);
    }
}

同样,您可以将模式匹配与instanceof一起使用,以合并和简化带有|| if语句。 操作员。

还请参见:

预览语言功能

模式匹配已作为Java 14中的预览语言功能发布。随着Java每六个月发布一次新的版本节奏,新的语言功能就作为预览功能发布了,这些功能既不完整也不是半熟。 预览语言功能从本质上讲意味着即使开发人员可以使用此功能,但在将来的Java版本中,其更详细的信息可能会更改-取决于开发人员对此功能所收到的反馈。 与API不同,将来无法弃用语言功能。 因此,如果您对文本块有任何反馈,请在JDK邮件列表中共享(需要成员身份)。

语言功能可以保留为多个Java版本的预览功能。

如果使用命令提示符,则必须在编译和运行时启用预览功能。 要编译一个类,例如Java14 ,该类将Pattern Matching与instanceof使用,请使用以下命令:

javac --enable-preview --release 14 Java14.java

编译器会警告您您正在使用预览语言功能(这是出于意图–因此您知道您正在使用预览功能)。

要执行使用模式匹配(或Java 14中的另一种预览语言功能)的类(例如Java14 ),请使用以下命令:

java --enable-preview Java14

要在IntelliJ IDEA中使用模式匹配,请下载其最新版本(2020.1 EAP),并将其Project SDK配置为JDK 14,并将“项目语言级别”配置为“ 14(预览)–记录,模式,文本块”。 可以使用IntelliJ IDEA菜单选项访问项目结构:

Java

结论

作为开发人员,我们经常在代码中使用instanceof运算符。 将模式匹配与instanceof一起使用将使我们的代码每天简洁明了,更易于编写和阅读。

如果您想了解更多关于instanceof模式匹配以及其他Java 14功能的信息,可以看一下我关于Java 14语言功能的截屏视频:

翻译自: https://jaxenter.com/pattern-matching-for-instanceof-in-java-14-169830.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值