【问题标题】:How to check whether at least one boolean is true?如何检查至少一个布尔值是否为真?
【发布时间】:2021-11-14 07:00:00
【问题描述】:

给定一个布尔值的数组/列表,例如:

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

我想检查至少一个布尔值是否为真。所以样本数为true=2(a + b)。

我尝试了番石榴风格:

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

但导致了 NPE。

您能否指出一个更简单的解决方案?

【问题讨论】:

  • "我尝试过 guava 风格" 请注意,NPE 与 Guava 无关:它是从 Boolean 元素构造 boolean[] 产生的,其中 null 元素的自动拆箱会导致 NPE .

标签: java boolean guava


【解决方案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() 也将返回真。如果它们都不为真(假或空),那么它将返回假,

    【讨论】:

    • "x -> x 是一个 lamda,它接受一个布尔值并返回一个布尔值" 实际上,它是一个多表达式,在调用 Stream<Boolean>::anyMatch 的上下文中它是一个 Predicate<Boolean>,这意味着它需要一个Boolean 并返回一个boolean,其值为input.booleanValue(),这意味着它要求input 为非空。
    • 哦,好吧,如果是null,则从Booleanboolean 的拆箱会引发NPE?
    猜你喜欢
    • 2011-03-05
    • 2015-09-22
    • 2012-10-27
    • 2017-10-06
    • 2023-03-19
    • 2016-09-19
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多