我知道如何检查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个设置器可以用于50个excel单元,但有时会有5个或6个嵌套对象,这是一个真正的噩梦
可以说像setCell方法
public setCell(String name,Object object){
return object; // make sure no nested object is null
}
我希望我的问题足够明确。请记住,我不能简单地更改嵌套对象,因为它的遗留代码和在很多地方使用!任何想法?
答案 0 :(得分:1)
正如您在问题中提到的那样,使用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()));