2015-04-24 17 views
5

object.getProperty().getSubProperty().getSubSubProperty();Come codificare una coalesce intelligente in Java?

Prendere in considerazione il codice sopra. Un oggetto ha una proprietà, che ha una subProperty, che ha una subSubProperty, a cui è possibile accedere con i metodi getter.

Cosa possiamo fare in Java per realizzare qualcosa di simile:

Util.coalesce(object.getProperty().getSubProperty().getSubSubProperty(), defaultSubSubProperty);

org.apache.commons.lang3.ObjectUtils.defaultIfNull ha qualcosa di simile. Ma il problema con questo metodo è che funziona solo quando proprietà e subProperty non sono nulle. Vorrei un modo per ottenere subSubProperty o defaultSubSubProperty anche quando la proprietà e subProperty sono nulle.

Come possiamo fare questo?

risposta

10

È possibile utilizzare Extra in Java 8.

String s = Optional.ofNullable(object) 
        .map(Type::getProperty) 
        .map(Type2::getSubProperty) 
        .map(Type3::getSubSubProperty) 
        .orElse(defaultValue); 

È inoltre possibile utilizzare orElseGet(Supplier) o orElseThrow(Throwable)

+0

Wonderfull. Ma ho ancora un problema. Qui, la produzione Java è Java 7, possiamo usarla in Java 7 usando un jar o qualcosa del genere? – GarouDan

+0

@GarouDan in teoria, ci sono backport della libreria ma non ne ho usato nessuno. Senza lo zucchero sintattico immagino che usare una libreria sia più doloroso che scriverlo da solo. –

+1

@GarouDan Puoi ancora usare Guava ['Optional'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html) (' ofNullable' -> 'fromNullable',' map' -> 'transform'), ma dovrai espandere tutti i riferimenti dei metodi alle sottoclassi anonime, il che renderà il tuo codice orribilmente grande. –