Java 8 Boolean.logicalOr method

JavaJava 8

Java Problem Overview


In Java 8 new methods in Boolean class have been added.

Let's just talk about one of them

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

Now, my question is, Why were they needed?

What's the difference between the following two cases.

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

What's so special about Boolean.logicalOr() and when should I prefer one over the other.

Java Solutions


Solution 1 - Java

Mainly those methods are there for your convenience and to make the code more readable by using the method references in lambdas/streams. Let's look at an example:

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

trying to write this with a || b:

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

not that readable, right?

As Sotirios Delimanolis stated in the comment, you may also want to have a look at the javadoc and follow @see BinaryOperator. Or have a look at the function package summary javadoc.

Solution 2 - Java

It has to do with method references. Like this you can use the || (logical or) operator also in lambdas.

In this manner there also other new functions like Objects.isNull etc.

Using function references instead of a lambda expression like (a,b) -> a || b is more in line with streams and lambda 'look-and-feel'.
Also, a method reference will produce less byte code, and thus mean faster execution times (a bit at least).

Solution 3 - Java

> What's the difference between the following two cases.
> boolean result = a || b; or Boolean result = Boolean.logicalOr(a,b);

I would like to put my points here regarding above question. Here is the body of Boolean.logicalOr

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

So we can see that it's doing a || b ultimately. But it becomes non short circuit when we use Boolean.logicalOr instead of ||. Because it (Boolean.logicalOr) would be considered as (a || b) which is different from a || b when it comes with some other logical operators.
Example-: Please refer to the below code of snippet...

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);
}

Below are the results-:

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

We can see it's producing different results whenever it's been used with other logical operator. So one need to be cautious about using || over Boolean.logicalOr or vice versa. Obviously Boolean.logicalOr is more readable than ||. But each one is having their significance and can be used as below.
if(bCheck1 && bCheck2 || bCheck3) can't be replaced by if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))
However replacing if(bCheck1 && (bCheck2 || bCheck3)) to if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3)) would definitely be a good idea.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionShubham BatraView Question on Stackoverflow
Solution 1 - JavaRolandView Answer on Stackoverflow
Solution 2 - JavaSebastianView Answer on Stackoverflow
Solution 3 - JavaAshish KumarView Answer on Stackoverflow