给定一个布尔值数组/列表,如:
Boolean a = true;
Boolean b = true;
Boolean c = false;
Boolean d = null;
我想检查是否至少有一个布尔值为真。因此样本计数为true=2 (a + b)。
我试过guava style:
return Booleans.contains(
new boolean[] {a, b, c, d}, true);
却导致了NPE。
你能指出一个更简单的解决方案吗?
由于任何布尔值都可以为空:
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);
}
然后调用like
return isTrue(a) || isTrue(b) || isTrue(c) || isTrue(d);
你可以直接使用流
return Stream.of(a,b,c,d).anyMatch(x -> x);
Stream.of()
创建一个包含四个布尔值的新流。anyMatch()
检查它们是否满足传递的布尔谓词最后,x -> x
是一个lambda,它接受布尔值并返回布尔值。因为我们想检查true
是否是参数之一,所以我们可以这样做。这将接受元素并返回该元素,该元素是一个布尔值,将为True, False或null。如果为真,anyMatch()
也将返回真。如果它们都不为真(False或null),则返回False