Метод Java 8 Boolean.logicalOr
В Java добавлены 8 новых методов в классе Boolean
.
Позвольте просто поговорить об одном из них
public static boolean Boolean.logicalOr(boolean a , boolean b)
Теперь, мой вопрос: зачем они нужны?
Какая разница между следующими двумя случаями.
boolean result = a || b;
или Boolean result = Boolean.logicalOr(a,b);
Что такого особенного в Boolean.logicalOr()
, и когда я должен предпочесть один за другим.
Ответы
Ответ 1
В основном эти методы доступны для вашего удобства и делают код более читаемым, используя ссылки метода в lambdas/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. Или посмотрите на описание пакета функций javadoc.
Ответ 2
Это связано с ссылками на методы. Подобным образом вы можете использовать оператор ||
(логический или) также в lambdas.
Таким образом, есть и другие новые функции, такие как Objects.isNull
и т.д.
Использование ссылок на функции вместо выражения лямбда, такого как (a,b) -> a || b
, больше соответствует потокам и лямбда-представлению.
Кроме того, ссылка на метод будет давать меньше байтового кода и, следовательно, означает более быстрое время выполнения (по меньшей мере, бит).
Ответ 3
Какая разница между следующими двумя случаями.
boolean result = a || б; или Boolean result = 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))
определенно будет хорошей идеей.