Java:避免检查嵌套类中的空值(深度空值检查)

2022-08-31 17:03:03

想象一下,我有一个班级家庭。它包含一个人员列表。每个(类)人员包含一个(类)地址。每个(类)地址包含一个(类)邮政编码。任何“中间”类都可以为 null。

那么,有没有一种简单的方法可以到达邮政编码,而不必在每个步骤中检查空值?也就是说,有没有办法避免以下菊花链代码?我知道没有“原生”Java解决方案,但希望有人知道库或其他东西。(检查了Commons和番石榴,没有看到任何东西)

if(family != null) {
    if(family.getPeople() != null) {
        if(family.people.get(0) != null) {
            if(people.get(0).getAddress() != null) {
                if(people.get(0).getAddress().getPostalCode() != null) {
                    //FINALLY MADE IT TO DO SOMETHING!!!
                }
            }
        }
    }
}

不可以,不能更改结构。它来自我无法控制的服务。

不,我不能使用Groovy,它是方便的“猫王”运算符。

不,我宁愿不等待Java 8:D

我不敢相信我是第一个厌倦了编写这样代码的开发人员,但我无法找到解决方案。


答案 1

您可以用于:

product.getLatestVersion().getProductData().getTradeItem().getInformationProviderOfTradeItem().getGln();

可选等效项:

Optional.ofNullable(product).map(
            Product::getLatestVersion
        ).map(
            ProductVersion::getProductData
        ).map(
            ProductData::getTradeItem
        ).map(
            TradeItemType::getInformationProviderOfTradeItem
        ).map(
            PartyInRoleType::getGln
        ).orElse(null);

答案 2

您的代码的行为与

if(family != null &&
  family.getPeople() != null &&
  family.people.get(0) != null && 
  family.people.get(0).getAddress() != null &&
  family.people.get(0).getAddress().getPostalCode() != null) { 
       //My Code
}

由于短路评估,这也是安全的,因为如果第一个条件为假,则不会评估第二个条件,如果第二个条件为假,则不会评估第三个条件,....你不会得到NPE,因为如果它。