Java 8的Boolean.logicalOr方法

在Java中,新增了Boolean类中的新方法。

我们来谈谈其中之一

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

现在,我的问题是,他们为什么需要?

以下两种情况有什么区别?

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

关于Boolean.logicalOr()什么特别之处,我应该什么时候更喜欢一个。

这些方法主要是为了您的方便,并通过使用lambdas / streams中的方法引用使代码更具可读性。 我们来看一个例子:

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

试图用a || b写这个 a || b

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

不是那可读,对吗?

正如Sotirios Delimanolis在评论中指出的那样,您可能还想看看javadoc,并遵循@see BinaryOperator 。 或者看看function包总结javadoc 。

它与方法引用有关。 像这样你可以使用|| (逻辑或)操作符也在lambdas中。

以这种方式,还有其他的新function,如Objects.isNull

使用函数引用而不是像(a,b) -> a || b这样的lambdaexpression式 (a,b) -> a || b更符合溪stream和lambda的“外观和感觉”。
另外,方法引用将产生更less的字节码,因此意味着更快的执行时间(至less有点)。

以下两种情况有什么区别?
布尔结果=一个|| b; 或者布尔结果= Boolean.logicalOr(a,b);

我想就这个问题提出我的观点。 这是Boolean.logicalOr的主体

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

所以我们可以看到它正在做a || b a || b最终。 但是当我们使用Boolean.logicalOr而不是||时,它变成了非短路 。 因为它( Boolean.logicalOr )将被认为是(a || b) ,它不同于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))replace为if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))肯定是一个好主意。