如何用可选的替换get梯子?

Cro*_*ool 3 java java-8

我有一个类结构,如

 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的声明,但又想避免牛市检查?

Pet*_*rey 6

您可以使用 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调用链到达结尾.