Как проверить, является ли хотя бы одно логическое значение истинным?

#java #boolean #guava

Вопрос:

Учитывая массив/список логических значений, таких как:

 Boolean a = true;
Boolean b = true;
Boolean c = false;
Boolean d = null;
 

Я хочу проверить, верно ли хотя бы одно из логических значений. Таким образом, выборка будет считаться истинной=2 (a b).

Я попробовал стиль гуавы:

 return Booleans.contains(
        new boolean[] {a, b, c, d}, true);
 

Но привело к NPE.

Может быть, вы могли бы указать на более простое решение?

Комментарии:

1. «Я пробовал стиль гуавы» обратите внимание, что NPE не имеет ничего общего с Guava: он возникает в результате построения boolean[] Boolean элементов из, где автоматическая распаковка нулевых элементов приводит к NPE.

Ответ №1:

Поскольку любое из логических значений может быть равно нулю:

 return Stream.of(a, b, c, d).anyMatch(Boolean.TRUE::equals);
 

или

 return Arrays.asList(a, b, c, d).contains(Boolean.TRUE);
 

(Вы не можете использовать List.of , потому что это нетерпимо к нулю)

Если вы хотите написать это в более императивном стиле, определите метод проверки истинности:

 boolean isTrue(Boolean b) {
  return Boolean.TRUE.equals(b);
}
 

затем вызовите что-то вроде

 return isTrue(a) || isTrue(b) || isTrue(c) || isTrue(d);
 

Ответ №2:

Вы могли бы просто использовать поток

 return Stream.of(a,b,c,d).anyMatch(x -> x);
 

Stream.of() создает новый поток из четырех логических значений.
anyMatch() проверяет, удовлетворяет ли какой-либо из них логическому предикату, который передается
Наконец, x -> x является lamda, которая принимает логическое значение и возвращает логическое значение. Поскольку мы хотим проверить, является ли true это одним из параметров, мы можем это сделать. Это приведет к получению элемента и возврату элемента, который, будучи логическим, будет иметь значение True, False или null. Если это правда anyMatch() , то также вернется true. Если ни один из них не является истинным(ложным или нулевым), то он вернет значение false,

Комментарии:

1. » x -> x это lamda, которая принимает логическое значение и возвращает логическое значение» на самом деле, это полиэкспрессия , где в контексте вызова Stream<Boolean>::anyMatch это a Predicate<Boolean> , что означает, что оно принимает a Boolean и возвращает boolean значение input.booleanValue() , значение которого равно, то есть оно должно input быть ненулевым.

2. О, хорошо, значит, это распаковка, из Boolean boolean которой выбрасывается NPE, если это null так ?