用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
,并且想要获得A
的String 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太遥远了 。