Подтвердить что ты не робот

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

4b9b3361

Ответ 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)) определенно будет хорошей идеей.