2017-01-19 42 views
56

在Java 8中新增了Boolean類的新方法。Java 8 Boolean.logicalOr方法

讓我們只是說說,是,他們爲什麼需要他們

public static boolean Boolean.logicalOr(boolean a , boolean b)

現在的一個我的問題?

以下兩種情況有什麼區別。

boolean result = a || b;Boolean result = Boolean.logicalOr(a,b);

什麼特別之處Boolean.logicalOr()當我喜歡一個比其他。

+14

javadoc說什麼?它是否有'@ see'參考可能有幫助? –

+4

在功能上,它們是相同的,但請不要在代碼中寫入'Boolean.logicalOr(a,b)'。當你有多個功能相同的編寫代碼的方法時,你應該總是選擇最具可讀性的。 – VGR

回答

77

主要是爲了方便您使用這些方法,並通過使用lambda/streams中的方法引用使代碼更具可讀性。讓我們來看一個例子:

Stream.of(/* .. some objects .. */) 
     .map(/* some function that returns a boolean */) 
     .reduce(Boolean::logicalOr); 

嘗試與a || b寫:

Stream.of(...) 
     .map(...) 
     .reduce((a, b) -> a || b); // logicalOr is actually using || 

不是可讀的,對不對?

由於Sotirios Delimanolis在評論中指出,您可能還想看看javadoc並按照@see BinaryOperator。或者看看function package summary javadoc

+1

'|'也可以是邏輯或者,不是短路。 – shmosel

+0

好的......在評論中增加了一點,那就是'logicalOr'實際上是使用'||' – Roland

+1

我想這個更清楚。雖然直接根據其論點進行操作,但沒有任何區別。 – shmosel

52

它與方法參考有關。像這樣,你也可以在lambdas中使用||(邏輯或)運算符。

以這種方式也有其他新功能,如Objects.isNull

使用函數引用,而不是lambda表達式像(a,b) -> a || b更符合流和拉姆達「外觀和感覺」線。
另外,方法引用會產生更少的字節碼,因此意味着更快的執行時間(至少有點)。

+1

'BiConsumer'不返回任何值。爲什麼不像'[documentation](https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#logicalOr-boolean-boolean-)那樣使用'BinaryOperator'? – shmosel

+1

現在已經離開了Java世界10個月;-) 我會離開它沒有任何代碼。 – Sebastian

+18

可能值得注意的是,因爲這是一個方法調用,所以你會失去'||'的短路行爲。 – Kevin

3

以下兩種情況有什麼區別。
布爾結果= a || b;或布爾結果= Boolean.logicalOr(a,b);

我想在這裏把我的觀點放在上面的問題上。這裏是Boolean.logicalOr

public static boolean logicalOr(boolean paramBoolean1, boolean paramBoolean2) 
    { 
    return (paramBoolean1) || (paramBoolean2); 
    } 

身體因此,我們可以看到,它在做什麼a || b大勢所趨。但當我們使用Boolean.logicalOr而不是||時,它變成非短路。因爲它(Boolean.logicalOr)將被視爲(a || b),與a || b不同時,它與其他一些邏輯運算符一起使用。
示例 - 請參閱以下代碼片段...

public static void main(String[] args) { 

    boolean bCheck1 = false, bCheck2 = true, bCheck3 = false; 
    System.out.println("bCheck1\t" + "bCheck2\t" + "bCheck3\t" + "checkOR-Result\t" + "checkLogicalOr-Result"); 

    bCheck1 = true; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
} 

private static boolean checkOR(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && bCheck2 || bCheck3; 
} 

private static boolean checkLogicalOr(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && Boolean.logicalOr(bCheck2, bCheck3); 
} 

下面是結果:

bCheck1 bCheck2 bCheck3 checkOR-Result checkLogicalOr-Result 
true true true true   true 
true true false true   true 
true false true true   true 
true false false false   false 
false true true true   false 
false true false false   false 
false false true true   false 
false false true true   false 

我們可以看到,每當它已經與其他邏輯運算符使用它產生不同的結果。所以需要謹慎使用||而不是Boolean.logicalOr,反之亦然。顯然Boolean.logicalOr||更具可讀性。但每個人都有其重要意義,可以用於下面。
if(bCheck1 && bCheck2 || bCheck3)不能被if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))代替
但是將if(bCheck1 && (bCheck2 || bCheck3))更換爲if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))絕對是一個好主意。

+0

條件運算符從左到右執行,但是如果存在「()」,則優先。所以,你的代碼的輸出是絕對正確的,但它與上述問題無關。請閱讀這篇文章,以澄清http://introcs.cs.princeton.edu/java/11precedence/。機器將永遠不會輸出錯誤:) – Joy

+0

@Joy我明白操作符的優先級。我已經給出了我的答案**關於Boolean.logicalOr()有什麼特別之處,我應該什麼時候比另一個更優先。**&**以下兩種情況有什麼區別。考慮到任何不瞭解優先級的新手,我已經給出了這個非常簡單的例子。對於老將來說這可能是徒勞的,但肯定會幫助任何新手。 –