你不能真正做到這一點不需要重複if
塊的正文。您可以將a || b
轉換爲!(!a && !b)
,但在使用&&
時,由於周圍的!(...)
,您無法將其拆分爲嵌套if
語句。
爲什麼你想這樣做呢?我的假設是,三個條件a
,b
和c
是非常長和/或複雜的。如果是這樣的話,我會建議下列之一:
聲明描述性名稱個Boolean變量和使用那些在條件
boolean isLoggedIn = // some really long data base lookup
boolean isGuest = // more data base stuff
boolean guestCanEdit = // a complex boolean expression
if (isLoggedIn || (isGuest && guestCanEdit)) { ...
定義了三種方法進行上述檢查並使用那些在if
if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ...
注意,howev呃,第一個版本不使用短路,即所有的條件都會被評估,即使第一個版本已經是真的,或者第二個版本是假的。如果計算成本昂貴或者例如如果第三次檢查只有在第二次檢查成功時纔可能發生(例如在null
檢查後)。
關於你comment:條件
if (list.isEmpty() ||
(!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))
是不是真的是長,我不會建議任何的這個上面的方法,因爲它不會得到更短的那種方式。但你可以縮短它,因爲b
部分是多餘的。由於||
短路,(b && c)
只有當!a
評價,因爲你的b
是!a
,可以縮短它只是a || c
if (list.isEmpty() || list.getLast().compareTo(heap.peek().value) <= 0)
如果你的目標是要算多少次compareTo
被調用,您可以使用此:
if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)
現在這只是b && c
,W ith a
部分完全丟失。請注意,這是不相當於到a || (b && c)
了,但在這種情況下,這是一個很好的事情,因爲由於再次短路,compareTo
實際上不可以在a || c
如果a
已經評價true
調用。
你爲什麼要這樣做?如果條件'a','b'和'c'太長,可以考慮爲這些條件寫簡短但具有描述性的名稱的方法。 'if(isLoggedIn(user)||(isGuest(user)&& guestCanEdit(topic)))' –
你的問題是什麼?我不明白。 – Rohit
我會寫一個更加明確的問題的擴展版本。所以if語句是 'if(list.isEmpty()||(!list.isEmpty()&& list.getLast()。compareTo(heap.peek()。value)<= 0))' 在while循環內運行。我在這裏要做的是計算'compareTo()'方法被調用的次數,我認爲我應該拆分if語句來更準確地計算它。 – henrich