2015-04-24 10 views
5

object.getProperty().getSubProperty().getSubSubProperty();Jak kodować inteligentną koalescencję w Javie?

Należy uwzględnić powyższy kod. Obiekt ma właściwość, która ma właściwość subProperty, która ma subSubProperty, do której można uzyskać dostęp za pomocą metod getter.

Co możemy zrobić w Javie, aby osiągnąć coś takiego:

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

org.apache.commons.lang3.ObjectUtils.defaultIfNull ma czegoś takiego. Ale problem z tą metodą polega na tym, że działa on tylko wtedy, gdy właściwość i pod-właściwość nie są zerowe. Chciałbym uzyskać subSubProperty lub defaultSubSubProperty nawet wtedy, gdy właściwość i subProperty są puste.

Jak możemy to zrobić?

Odpowiedz

10

Opcjonalnie można używać w języku Java 8.

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

Można również użyć orElseGet(Supplier) lub orElseThrow(Throwable)

+0

Wonderfull. Ale wciąż mam problem. Tutaj Java produkcyjna to Java 7, czy możemy jej użyć w Javie 7 przy użyciu słoika lub czegoś podobnego? – GarouDan

+0

@GarouDan w teorii, istnieje backports biblioteki, ale nie użyłem żadnych. Bez cukru syntaktycznego wyobrażam sobie, że używanie biblioteki jest bardziej bolesne niż pisanie samemu. –

+1

@GarouDan Nadal możesz używać Guawy ['Opcjonalne'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html) (' ofNullable' -> 'fromNullable',' map' -> 'transform'), ale będziesz musiał rozwinąć wszystkie odwołania do metod do anonimowych podklas, co uczyni twój kod okropnie dużym. –