我有一个类结构,例如
Class A {
int val;
}
Class B {
A a;
}
Class C {
B b;
}
现在,所有类都来自第三方服务,我从中得到响应,我想读取int值。 但我不想做像
这样的事情假设c是C类型的变量。
if (c != null && c.getb != null) {
B b = c.getb()
and so on.
}
我想避免这些空检查,因为实际上这些pojos非常分层,并且有很多字段。
我尝试使用
Optional<Integer> val = Optional.ofNullable(c.getb().geta().getval());
val.elseThrow(Ex::new)
但这不是正确的方法(如果b不存在则抛出空指针异常,因为可选的是int)。 我怎么办才能解决这样一种情况,即我无法控制Pojos的声明,但又想避免牛市检查?
答案 0 :(得分:6)
您可以使用map
int val = Optional.ofNullable(c)
.map(x -> x.getb())
.map(x -> x.geta())
.map(x -> x.getval())
.getOrThrow(Ex::new);
如果您知道类名,则可以使用方法引用。 e.g。
int val = Optional.ofNullable(c)
.map(C::getb)
.map(B::geta)
.map(A::getval)
.getOrThrow(Ex::new);
这适用于map
如果值不是null
,则会调用该函数一次,否则结果也是null
。即任何空值都通过map
调用链到达终点。