用Java 8替换重复的get语句可选

我有一个用例,我有嵌套类和顶级类的对象。 我想得到一个在第N级的值。 我正在重复使用getter来实现这一点以避免NPE。 示例代码(假设有吸气剂)

class A { String a1; String getA1() { return a1; } } class B { A a; A getA() { return a; } } class C { B b; B getB() { return b; } } class D { C c; C getC() { return c; } } 

如果我有一个D类的对象d ,并且想要获得AString a1 ,那么我正在做的是:

 String getAValue(D d) { String aValue = null; if(d != null && d.getC() != null && d.getC().getB() != null && d.getC().getB().getA() != null) { aValue = d.getC().getB().getA().getA1(); } return aValue; } 

这个重复的看起来真的很难看。 如何使用java8 Optional来避免它?

编辑:我不能修改上面的类。 假设这个d对象作为服务调用返回给我。 我只接触过这些吸气剂。

使用Optional可以通过一系列map()调用获得一个漂亮的单行程序:

 String getAValue(D d) { return Optional.ofNullable(d) .map(D::getC).map(C::getB).map(B::getA).map(A::getA1).orElse(null); } 

如果链中的任何内容为null ,包括d本身,则将执行orElse()

将每个嵌套类包装在Optional中:

 Class A { String a1; } Class B { Optional a; } Class C { Optional b; } Class D { Optional c; } 

然后使用flatMap和map来操作这些可选值:

 String a1 = d.flatMap(D::getC) // flatMap operates on Optional .flatMap(C::getB) // flatMap also returns an Optional .flatMap(B::getA) // that's why you can keep calling .flatMap() .map(A::getA1) // unwrap the value of a1, if any .orElse("Something went wrong.") // in case anything fails 

您可能想要查看Monads的概念。 如果你喜欢冒险, Scala与Java太遥远了 。