2015-09-16 20 views
5

Yuvalanmış sınıflarım ve üst sınıfın bir nesnesine sahip olduğum bir kullanım durumum var. Nth seviyesinde bir değer elde etmek istiyorum. NPE'yi önlemek için bunu elde etmek için alıcıları tekrarlıyorum.Yinelenen get deyimini Java ile değiştirme 8 İsteğe bağlı

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

ben sınıfın D bir nesne d var ve A ait String a1 almak istiyorsanız, Numune kodu (varsayarak getters vardır) ne yaptığımı takip ediyor:

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

Bu tekrarlayan a gerçekten çirkin görünüyor. Java8 İsteğe bağlı kullanarak nasıl önleyebilirim?

DÜZENLEME: Yukarıdaki sınıfları değiştiremiyorum. Bu d nesnesinin servis çağrısı olarak bana döndüğünü varsayalım. Sadece bu alıcılara maruz kaldım.

cevap

2

Wrap bir Opsiyonel her iç içe sınıfı:

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

Sonra flatMap kullanabilir ve bu isteğe bağlı değerler üzerinde çalışmak üzere harita:

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 

Sen Monads kavramını kontrol etmek isteyebilirsiniz. Ve maceraperest hissediyorsanız, Scala is too distant from Java. Bir oda bir astar için map() aramaların bir dizi

+0

'eşlemi (D :: getC)' de çalışır. – ZhongYu

6

Kullanım Optional:

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

şey d dahil zinciri boyunca null, kendisi ise, orElse() çalıştırır. "GetC" null "C" değerini döndürürse

+1

Bu işe yaradı. Teşekkür ederim! :) – AKB