2015-09-16 27 views
5

我有一个用例,其中有嵌套的类和顶级类的对象。我想得到一个在第N级的价值。我重复使用getter来达到这个目的,以避免NPE。示例代码(假设干将在那里)使用Java 8替换重复的get语句可选

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; 
} 

这重复的a看起来真的很难看。我如何通过使用java8来避免它可选?

编辑:我不能修改上述类。假设这个d对象作为服务调用返回给我。我只接触到这些获得者。

回答

2

裹在一个可选的每个嵌套类:

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

然后使用flatMap并映射到这些可选值进行操作:

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 is too distant from Java

+0

'map(D :: getC)'也适用,如果'getC'返回可为空的'C'。 – ZhongYu

6

使用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()将执行。

+1

工作。谢谢! :) – AKB