2015-09-16 61 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