我知道如何检查 NullPointerException
的嵌套对象的多种方法,对于 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
}
我希望我的问题足够清楚。请记住,我不能简单地更改嵌套对象,因为它是遗留代码并在很多地方使用!有什么想法吗?
最佳答案
正如您在问题中提到的那样,请使用可选
,但它的长度更长。
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()));
关于java - 嵌套对象空值检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800955/