2017-01-19 43 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()有什么特别之处,我应该什么时候比另一个更优先。**&**以下两种情况有什么区别。考虑到任何不了解优先级的新手,我已经给出了这个非常简单的例子。对于老将来说这可能是徒劳的,但肯定会帮助任何新手。 –