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

时间:2018-01-31 19:26:57

标签: java java-8

我有一个类结构,例如

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

1 个答案:

答案 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调用链到达终点。