【问题标题】:Toggling boolean value, but just once? (java)切换布尔值,但只有一次? (爪哇)
【发布时间】:2011-09-02 08:54:41
【问题描述】:

有时需要在循环中仅存储一次布尔值(以记录它已从 false 更改为 true,反之亦然),同时执行循环到最后但不再关心更改在布尔值中。示例:


    public static boolean dbDelete(Collection argObjectCollectionToDelete) {
        boolean result = true;
        for (Object object : argObjectCollectionToDelete) {
            boolean dbDelete = dbDelete(object);
            if (!dbDelete) {
                result = false;
            }
        }
        return result;
    }

有没有办法执行等效的代码


if (!dbDelete) {
    result = false;
}


if (!dbDelete && !result) {
    result = false;
}

以更优雅的方式,最好是一行?

【问题讨论】:

  • 如果任何方法返回 true,则反面是 b |= method()

标签: java boolean toggle


【解决方案1】:

怎么样:

result &= dbDelete(object);

这相当于:

result = result & dbDelete(object);

因此,只有当result以前为真且dbDelete 返回真时,它才会为真。

【讨论】:

  • 肯定比我的答案短,但至少对我来说,更难阅读。
  • @nfechner:复合作业是一种后天习得的品味,但我认为至少对它们感到满意是值得的,即使你自己并不经常使用它们。只是偶尔这样的事情会产生巨大的不同——尤其是在您可以使用单个表达式但不能使用if 块的情况下。
  • 非常好,我正在追求这样的东西。 :)
【解决方案2】:
if (!dbDelete(object)) {
    result = false;
}

【讨论】:

    【解决方案3】:

    结果 = dbDelete(对象) ?结果:假;

    【讨论】:

    • "将循环执行到最后,但不再关心布尔值的变化"
    • 我刚刚更新了它。现在它只能从真到假,永远不能回到真。
    【解决方案4】:

    尝试在变量名中赋予更多含义 - 这会让事情变得更容易。

    public static boolean dbDelete(Collection argObjectCollectionToDelete) {
        boolean completedSuccessfully = true;
        for (Object object : argObjectCollectionToDelete) {
            boolean dbDelete = dbDelete(object);
            if (completedSuccessfully && !dbDelete) {  //won't change anymore after failure
                completedSuccessfully = false;
            }
        }
        return completedSuccessfully;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2016-04-22
      • 2019-05-08
      • 1970-01-01
      • 2015-07-20
      • 2021-09-02
      相关资源
      最近更新 更多