2015-04-24 19 views
5

object.getProperty().getSubProperty().getSubSubProperty();如何在Java中編寫智能合併?

考慮上面的代碼。一個對象具有一個屬性,該屬性具有一個subProperty,它具有一個subSubProperty,可以使用getter方法訪問該屬性。

我們可以做在Java中怎麼實現這樣的:

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

org.apache.commons.lang3.ObjectUtils.defaultIfNull有這樣的事情。但是這個方法的問題在於,當property和subProperty不爲null時它就會工作。即使在property和subProperty爲null的情況下,我也希望獲得subSubProperty或defaultSubSubProperty。

我們該怎麼做?

回答

10

您可以在Java 8

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

使用可選您還可以使用orElseGet(Supplier)orElseThrow(Throwable)

+0

完美的事情。但我仍然有問題。在這裏,生產Java是Java 7,我們可以使用jar或類似的東西在Java 7中使用它嗎? – GarouDan

+0

@GarouDan在理論上有圖書館的backports,但我沒有用過。如果沒有語法糖,我想用圖書館比自己寫書更痛苦。 –

+1

@GarouDan您仍然可以使用Guava的['Optional'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html)('ofNullable' - > 'fromNullable','map' - >'transform'),但是你必須將所有的方法引用擴展到匿名子類,這會使你的代碼非常大。 –