#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
это aPredicate<Boolean>
, что означает, что оно принимает aBoolean
и возвращаетboolean
значениеinput.booleanValue()
, значение которого равно, то есть оно должноinput
быть ненулевым.2. О, хорошо, значит, это распаковка, из
Boolean
boolean
которой выбрасывается NPE, если этоnull
так ?