Java 8 Boolean.логический метод
в Java 8 новые методы в Boolean класс был добавлен.
давайте просто поговорим об одном из них
public static boolean Boolean.logicalOr(boolean a , boolean b)
теперь мой вопрос, зачем они были нужны?
в чем разница между следующими двумя случаями.
boolean result = a || b; или Boolean result = Boolean.logicalOr(a,b);
что такого особенного Boolean.logicalOr() и когда я должен предпочесть одну над другой.
3 ответов:
В основном эти методы существуют для вашего удобства и для того, чтобы сделать код более читаемым с помощью ссылок на методы в 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 ||не читается, Да?
как заявил Сотириос Делиманолис в комментарии, вы также можете взглянуть на javadoc и следовать @см BinaryOperator. Или взгляните на
Это связано со ссылками на методы. Как это вы можете использовать
||(логическое или) оператор в лямбды.таким образом, есть и другие новые функции, такие как
Objects.isNulletc.использование ссылок на функции вместо лямбда-выражения типа
(a,b) -> a || bбольше соответствует потокам и лямбда "внешний вид".
Кроме того, ссылка на метод будет производить меньше байтового кода и, таким образом, означает более быстрое время выполнения (по крайней мере, бит).
в чем разница между следующими двумя случаями.
логический результат = a / / b; или логический результат = Boolean.logicalOr (a, b);Я хотел бы поставить свои точки здесь относительно выше вопрос. Вот тело
Boolean.logicalOrpublic 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мы видим, что он дает разные результаты всякий раз, когда он используется с другим логическим оператором. Поэтому нужно быть осторожным в использовании
||overBoolean.logicalOrили наоборот. ОчевидноBoolean.logicalOrявляется более читаемым, чем||. Но каждый из них имеет свое значение и может быть используется как показано ниже.if(bCheck1 && bCheck2 || bCheck3)не может быть замененif(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))заменаif(bCheck1 && (bCheck2 || bCheck3))доif(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))определенно было бы хорошей идеей.
Comments