2012-09-26 75 views
2

可能重複:
How to get the first non-null value in Java?Java條件快捷

我有以下操作

function1(function2(param1,param2)); 

如果函數2返回null我想它以零替代。我可以通過多種方式做到這一點,但是有沒有一些快捷方式符號?例如,是否有沿着這

function1(function2(param1,param2)==null || "0") 

注意的線什麼:功能2返回一個字符串。

+0

通過「快捷方式,」你的意思是你不想要調用兩次函數2,你也不想使用一箇中間變量?如果是這樣,你運氣不好。 –

+0

你想要表達式的類型是什麼? (即,要傳遞給函數1的值)。 0是一個int,它是一個原始類型(不能爲null),但是function2()顯然返回一個引用。 –

+0

@JamesMcLeod通過快捷方式我的意思是我不想將函數2賦給變量,然後在將它傳遞給函數1之前將它傳遞給「if」語句 –

回答

1

怎麼樣

function1(function2(param1,param2) != null? function2(param1, param2): 0); 

順便說一句,因爲它叫了兩聲就只能用這個,如果函數2不作任何數據的任何永久性的變化,如果確實如此,那麼你可能會得到不同的回答第二時間。

+0

我會試試這個,讓你知道。 –

3

當然,也有一個三元運算符,做幾乎正是:

<expression> ? <value if expression is true> : <value if expression is false> 

所以,

String result = function2(param1,param2); 
function1(result != null ? result : "0"); 

會做你想要什麼。

+0

這不會調用function2兩次嗎? – gtgaxiola

+0

@gtgaxiola:將其更改爲首先保存結果。 – Keppil

+0

我認爲保存結果與簡潔的願望是矛盾的;即它不能在表達式中完成。 –

4

在切換到Guava之前,我發現自己爲每個項目編寫了以下函數。它可能已經在某個庫中實現了。

<T> public static T coalesce(T... elements){ 
    for(T element : elements) { 
     if (element != null) return element; 
    } 
    throw new NoSuchElementException(); 
} 

// Usage: 

function1(coalesce(function2(param1,param2), "default value")); 

這是很好的,因爲有沒有重複的代碼,而不必引入一個臨時變量或兩次執行相同的呼叫(如先前提出的條件運算符的thingie)之間進行選擇。這並不好,因爲它讀起來不太流利。

如果你正在使用番石榴(你應該是),你可以使用Optionalavoid null,這也有利於使你的API更清晰,更不易於NullPointerException s。

void function1(String arg) {} 
Optional<String> function2(){ /* insert code*/ } 

// Usage: 
function1(function2().or("default value")); 
0

使用表達條件?與分配

Integer value = function1((value=function2(param1,param2)) != null? value: 0);