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() и когда я должен предпочесть одну над другой.

501   3  

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.isNull etc.

использование ссылок на функции вместо лямбда-выражения типа (a,b) -> a || b больше соответствует потокам и лямбда "внешний вид".
Кроме того, ссылка на метод будет производить меньше байтового кода и, таким образом, означает более быстрое время выполнения (по крайней мере, бит).

в чем разница между следующими двумя случаями.
логический результат = 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

мы видим, что он дает разные результаты всякий раз, когда он используется с другим логическим оператором. Поэтому нужно быть осторожным в использовании || over Boolean.logicalOr или наоборот. Очевидно Boolean.logicalOr является более читаемым, чем ||. Но каждый из них имеет свое значение и может быть используется как показано ниже.
if(bCheck1 && bCheck2 || bCheck3) не может быть заменен if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3)) замена if(bCheck1 && (bCheck2 || bCheck3)) до if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3)) определенно было бы хорошей идеей.

Comments

    Ничего не найдено.