我的项目中有一个复杂的模型结构 有时我必须从中获取深放置的值。它看起来如下:
something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
问题是这些方法中的每一个都可以返回null
,如果有的话,我会得到NullPointerException
。
我想知道的是,如果喜欢
,我应该写多长时间if(something != null && something.getSomethongElse() != null && something..getSomethongElse().getSecondSomething() != null && something.getSomethongElse().getSecondSomething().getThirdSomething() != null && omething.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething() != null) {
//process getFourthSomething result.
}
或者可以使用try..catch,如下所示:
SomethingFourth fourth = null;
try {
fourth = something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
} catch (NullPointerException e) { }
if(fourth != null) {
///work with fourth
}
我知道NPE
是一件值得避免的事情,但在我的情况下避免使用它并不是一件好事吗?
答案 0 :(得分:2)
如果您可以重构代码并使每个方法返回Optional
。可以避免空检查并尝试... catch。
Optional<Result> result = something.getSomethingElse()
.flatMap(e -> e.getSecondSomething())
.flatMap(x -> x.getThirdSomething())
.flatMap(e -> e.getFourthSomething());
// at the end to check if result is present
result.ifPresent(..some_logic_here..); // or result.orElse(...);
所以getSomethingElse()
会返回Optional<SomethingElse>
,getThirdSomething()
- Optional<ThirdSomething>
等等。我们必须在这里flatMap(Function<? super T,Optional<U>> mapper)
使用,因为如果提供的映射器是一个结果已经是可选的映射器,并且如果被调用,则flatMap不会使用附加的Optional包装它。换句话说,如果map
上的map(e -> e.getSecondSomething())
结果类型为Optional<Optional<SecondSomething>>
,我们就必须执行不必要的get()
调用 - map(...).get().map(...)
。
我希望这会有所帮助。
<强>更新的 强> 你可以使用方法引用做同样的事情。
Optional<Result> result = something.getSomethongElse()
.flatMap(SomethongElse::getSecondSomething)
.flatMap(SecondSomething::getThirdSomething)
.flatMap(ThirdSomething::getFourthSomething);