嵌套对象空检查

我知道很多方法如何检查嵌套对象是否NullPointerException为Java,因为对于Java

8,最简单的方法是应用Optional<param>。或使用简单的if代码,例如

if(foo.bar() != null && foo.getBar().getObject()!=null){

foo.getBar().getObject().getWhatever();

}

好吧,我的问题是,在不知道内部类/方法名称的情况下,是否有一种简单的方法可以做到这一点

更清楚地说,我有这样的代码

contract.getContactInfo().getPosition()

contract.getEntitledPerson().getEmail()

我想做一个这样的例子

excel.setCell(name1,contract.getContactInfo().getPosition());

excel.setCell(name2,contract.getEntitledPerson().getEmail());

如果它仅适用于2个嵌套对象或仅2个setter,但对于50个excel单元格(有时带有5或6个嵌套对象)却能做到,那真是一场噩梦

就像setCell方法一样

public setCell(String name,Object object){

return object; // make sure no nested object is null

}

我希望我的问题很清楚。请记住,由于它的遗留代码并在很多地方都使用过,因此我不能简单地更改嵌套对象!有任何想法吗 ?

回答:

正如您在问题中提到自己时,请使用Optional,但是它比较宽松。

excel.setCell(name1, Optional.of(contract).map(Contract::getContactInfo).map(ContactInfo::getPosition).orElse(null));

excel.setCell(name2, Optional.of(contract).map(Contract::getEntitledPerson).map(Person::getEmail).orElse(null));

像这样格式化时更容易阅读:

excel.setCell(name1, Optional.of(contract)

.map(Contract::getContactInfo)

.map(ContactInfo::getPosition)

.orElse(null));

excel.setCell(name2, Optional.of(contract)

.map(Contract::getEntitledPerson)

.map(Person::getEmail)

.orElse(null));

如果您的目标是最小的代码,则只需捕获即可NullPointerException。在我看来,这有点骇人听闻,但是可以解决问题。

首先,一个辅助方法:

public static <T> T nullGuard(Supplier<T> supplier) {

try {

return supplier.get();

} catch (@SuppressWarnings("unused") NullPointerException ignored) {

return null;

}

}

然后包装有问题的表达式:

excel.setCell(name1, nullGuard(() -> contract.getContactInfo().getPosition()));

excel.setCell(name2, nullGuard(() -> contract.getEntitledPerson().getEmail()));

以上是 嵌套对象空检查 的全部内容, 来源链接: utcz.com/qa/410034.html

回到顶部