我有一个类结构,如
Class A {
int val;
}
Class B {
A a;
}
Class C {
B b;
}
Run Code Online (Sandbox Code Playgroud)
现在,所有类都来自第三方服务,我从中获得响应,我想读取int值.但我不想做类似的事情
假设c是C类型的变量.
if (c != null && c.getb != null) {
B b = c.getb()
and so on.
}
Run Code Online (Sandbox Code Playgroud)
我想避免这些空检查,因为实际上这些pojos是非常分层的并且在它们中有很多字段.
我试过用
Optional<Integer> val = Optional.ofNullable(c.getb().geta().getval());
val.elseThrow(Ex::new)
Run Code Online (Sandbox Code Playgroud)
但这不是正确的方法(如果b不存在则抛出空指针异常,因为int上是可选的).我怎么办才能解决这样一种情况,即我无法控制Pojos的声明,但又想避免牛市检查?
您可以使用 map
int val = Optional.ofNullable(c)
.map(x -> x.getb())
.map(x -> x.geta())
.map(x -> x.getval())
.getOrThrow(Ex::new);
Run Code Online (Sandbox Code Playgroud)
如果您知道类名,则可以使用方法引用.例如
int val = Optional.ofNullable(c)
.map(C::getb)
.map(B::geta)
.map(A::getval)
.getOrThrow(Ex::new);
Run Code Online (Sandbox Code Playgroud)
这个工作过程是map将当值一旦调用该函数,如果它不是null,否则结果也null.即任何空值都通过map调用链到达结尾.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |