2015-10-28 37 views
4

我爲標題感到抱歉,但我無法找到一個用一句話來描述問題的好方法。總之,我有很多的Java代碼以下這一模式你如何模擬一個默認返回值的空安全運算符?

if (obj != null && obj.getPropertyX() != null) { 
    return obj.getPropertyX(); 
} 
return defaultProperty; 

可以改寫爲

return obj != null && obj.getPropertyX() != null ? obj.getPropertyX() : defaultProperty; 

它仍然是醜陋,我不知道是否有在谷歌番石榴或其他一些API庫來幫助清理這些代碼。具體來說,我正在尋找類似

return someAPI(obj, "getPropertyX", defaultProperty); 

我可以使用反射實現此方法,但我不知道這是做的正確方法。謝謝。

+0

其他語言有一個 「安全導航操作」,在那裏你可以說'OBJ .getPropertyX()',而不是'OBJ == NULL? null:obj.getPropertyX()'。例如,Groovy和C#。但是Java選擇了可選類。 http://docs.groovy-lang.org/latest/html/documentation/#_safe_navigation_operator –

回答

6

在Java 8中,您可以使用:

return Optional.ofNullable(obj).map(Obj::getPropertyX).orElse(defaultProperty); 
+0

還有一件事使得這個答案不足100%完美:如果defaultProperty是一個表達式而不是一個值,那麼在這個問題中defaultProperty只會在必要時進行評估,但在這個答案中它將被無條件評估。 –

+3

@KlitosKyriacou你應該建議'orElseGet'。 –

+0

謝謝。這工作,但並不真正乾淨,因爲我的預期:(無論如何,我不知道其他語言的安全導航操作符,看起來很優雅。 – hixhix