【问题标题】:How to apply a logical operator to all elements in Java如何将逻辑运算符应用于 Java 中的所有元素
【发布时间】:2016-05-10 14:05:06
【问题描述】:

我需要将&&(逻辑与)运算符应用于列表中的所有元素。问题是:在我目前的解决方案中,我需要初始化rowResult变量,我认为结果可能会因为变量具有初始值而变得无效。

ArrayList<Boolean> results = new ArrayList<>();
for (i = 1; i < results.size(); i++) {
    rowResult = rowResult && results.get(i);
}

【问题讨论】:

  • 好吧,看起来您应该在循环之前将其初始化为 true - 在这种情况下,只要列表中没有任何 false 值,它将保持为真。那是你要的吗?顺便说一句,您是否有任何理由忽略列表的第一个元素? (我还建议使用增强的 for 循环...)哦,您可以通过在达到 false 值时立即停止来优化它。
  • "那么 rowResult 可能会变得不正确" true(x AND true 永远不会更改x),因此将其初始化为true 应该可以解决问题。
  • 谢谢你们@JonSkeet 和@CherryDT,这就是我的想法:如果'rowResult' 是真的,那么如果'results' 有3x 'FALSE' 'rowResult' 将是'TRUE '。这是不正确的。我需要FALSE || FALSE || FALSE == FALSE
  • @P.Savrov: 不,如果rowResult 为真,而你使用rowResult = rowResult &amp;&amp; false,那么它将变为false
  • 我的错误,对不起。我想为 AND 和 OR 操作找到一个决策。对于 AND 情况,你是绝对正确的

标签: java arraylist operators


【解决方案1】:

正如 Jon Skeet 或 CherryDT 已经指出的那样,您可以将 rowResult 初始化为 true。那么您的代码可能如下所示:

boolean rowResult = true;
for (Boolean el: list) {
    rowResult = el && rowResult;
}

如果想使用 operatorOR - ||,则应将初始值设置为 false,将 operator 设置为 ||


在 Java 8 中,您可以将 reduce 方法应用于流:

List<Boolean> list = new ArrayList<>();
boolean rowResult = list.stream().reduce((a,b)-> a && b).orElse(true);

后者的优势在于您可以应用任何逻辑运算符来代替&amp;&amp;

在 java 8 示例中,只需将运算符更改为例如 || 即可应用 ORorElse 语句中的值仅适用于列表为空的情况。

【讨论】:

  • 但是如果列表包含所有错误值怎么办? rowResult 应该是 false,但 TRUE ||错误 ||错误 ||错误 || ... == 真
  • 在您最初的问题中,您发布了运营商 AND - &amp;&amp; 而不是 OR - ||。对于OR,将初始值更改为false,将运算符更改为||。在 java 8 示例中,只需更改运算符。 orElse 语句中的值仅适用于 list 为 Empty 的情况。
  • @dwysakowicz 你能相应地附加你的答案吗?可能会错过评论,这是解决 OP 问题的重要信息:)。
  • @Tom 我认为这次的答案涵盖了所有 OPs 问题 ;)
【解决方案2】:

在 Java 8 中,您可以使用流:

boolean rowResult = results.stream().allMatch(b -> b);

在 Java 8 之前,有 Guava:

boolean rowResult = Iterables.all(results, new Predicate<Boolean>() {
    @Override
    public boolean apply(Boolean input) {
        return input;
    }
});

【讨论】:

  • 请注意,至少 pre java 8 版本容易受到 NullPointerException 的影响。
  • 删除该注释并不能避免漏洞:P.
  • 我知道,我不是那个意思:D。我绝对同意,该代码易受 NPE 攻击。在那里有注释只是误导。
  • 嗯,在我看来,在那里有这个注释非常好,所以程序员记得列表中的每个项目可以null。但这是一个品味问题:)。
【解决方案3】:

在 java 8+ 中,您还可以使用 reduce 代替 allMatch。在我看来它更干净:

boolean result = results.stream().reduce(Boolean::logicalAnd).orElse(false);

您可以将logicalAnd 替换为您需要的运算符。 Boolean 类具有所有运算符。

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2020-02-23
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2013-03-18
    • 2016-10-02
    相关资源
    最近更新 更多