【问题标题】:Cleanest way to toggle a boolean variable in Java?在 Java 中切换布尔变量的最简洁方法?
【发布时间】:2010-09-18 11:13:14
【问题描述】:

有没有比简单的 if-else 更好的方法来否定 Java 中的布尔值?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

【问题讨论】:

  • 哦,太好了,我正要问同样的问题,尽管我的问题可能是针对 javascript/as3 或 ECMAScript 的,我想一般来说......这很容易被这个问题所涵盖.
  • 如果没有怎么办!运算符??

标签: java boolean


【解决方案1】:
theBoolean = !theBoolean;

【讨论】:

  • 这……真的很明显——哎呀!不知道为什么我没有想到。谢谢。
  • !布尔值似乎是一个自然的选择——也许在未来。
  • @ypnos: !!bool == !(!(bool)) == bool.
  • @ChristofferHammarström 按照这个逻辑,那么不应该 --integer == -(-(integer)) == integer 吗?
  • @user515655 - 该语言定义了一个-- 运算符(实际上是其中两个,以及两个++ 运算符),但没有定义一个!! 运算符。如果你想要-(-(integer)),你可以在两个- 字符之间使用空格。但是!! 解析为两个! 运算符,而不管空格。
【解决方案2】:
theBoolean ^= true;

如果您的变量超过四个字母,则击键次数会减少

编辑:当用作 Google 搜索字词时,代码往往会返回有用的结果。上面的代码没有。对于那些需要它的人,它是 bitwise XORdescribed here

【讨论】:

  • 简洁是智慧的灵魂。
  • 现在我可以随意地进行名称删除(语法删除?)异或,以便在我的程序员朋友面前看起来很酷。您的答案应该与所选的答案结合在一起,它们是纯粹的完美。
  • @ScottStanchfield 这样的人应该学习它。这一点都不难,也不是 hack,而且不知道它通常会导致糟糕的代码,例如这个问题的一个。这是一个真正的爆炸 - 使用标准约定的五行!
  • 想想“应该学习它”与“当你有一天修复错误时试图了解发生了什么”。是的,XOR 在这里很酷,但是我提到 XOR 的人说“嗯?”是惊人的。您应该始终为维护程序员编写代码,让他的工作尽可能轻松,因为无论代码写得多么好,阅读别人的代码真的很糟糕。
  • This operation is also 12% faster 比其他版本如 theBoolean = !theBoolean;theBoolean = theBoolean ? false : true;
【解决方案3】:

之前:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

之后:

boolean result = isresult();
result ^= true;

【讨论】:

  • 谁投了反对票?你能也解释一下原因吗?
  • 我能想到为什么有人可能会否决你的两个主要原因:1)线程死灵术(拜托!这个问题是 7(!)年前提出的!)&你的回答并没有带来任何新的东西; 2) 选民期望一些“更干净”的东西(阅读:更短) - AaronMaenpaa 的回答就是一个很好的例子。
  • @Elltz:相反 - 我实际上支持了他,因为回复在技术上是正确的。但是,我必须说,我不喜欢盗版以前用户的回复以获得廉价业力的趋势(请参阅 nlaq 的回答)。
  • @PriiduNeemre,在 7 年以上之前提出的问题和答案被接受,除了你的名单之外,你认为有人会放弃投票吗?除此之外,您的答案也不符合标准.. :(
  • 之后:布尔结果 = !isresult();
【解决方案4】:

有几个

“显而易见”的方式(对大多数人来说)

theBoolean = !theBoolean;

“最短”的方式(大部分时间)

theBoolean ^= true;

“最直观”的方式(最不确定)

theBoolean = theBoolean ? false : true;

额外:在方法调用中切换和使用

theMethod( theBoolean ^= true );

由于赋值运算符总是返回已分配的内容,这将通过按位运算符切换值,然后返回新分配的值以用于方法调用。

【讨论】:

  • 将实现包装在一个名为 toggle 的函数/方法中,然后几乎没有办法混淆它。
  • @Reiner: 对于C 肯定是这样,但在Java 中不允许混合使用布尔值和整数(在Java 中也无法使用while(1) 之类的东西)。
  • @Lambage:是的,但不利的一面是,您不能通过简单地传递布尔值来切换它,因为在 Java 中无法通过引用传递原语。您必须将方法的结果重新分配给您的变量,或者为布尔值创建一个包装类。
  • 上述“显而易见的方式”被 SONAR 标记为 - 应避免内部分配。
【解决方案5】:

如果您使用布尔 NULL 值并将其视为错误,请尝试以下操作:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

如果您不处理布尔 NULL 值,请尝试以下操作:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

这些是最干净的,因为它们在方法签名中显示了意图,与 ! 运算符相比更易于阅读,并且易于调试。

用法

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

当然,如果你使用 Groovy 或者允许扩展方法的语言,你可以注册一个扩展并且简单地做:

Boolean b = false
b = b.toggle() // == true

【讨论】:

  • 好方法,但并非完全明确(​​恕我直言)。对于使用/阅读“toggle(..)”的人可能会认为,调用该方法(无需再次将其分配给变量)可能已经切换了基础变量。我们现在看到代码很明显,但在现实生活中可能很难调试。更好的方法名称可能是“相反”或可能是“否定”,以使这一点更加明显;或者将第一种方法与对象 Boolean 一起使用,并在方法中真正切换它(但仍然有些模棱两可)。
【解决方案6】:

如果您没有做任何特别专业的事情,您可以随时使用 Util 类。例如,一个类的项目中的 util 类。

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

然后创建一个 Util 对象 Util u = new Util(); 并有一些东西作为回报System.out.println( u.flip(bool) );

如果您最终要一遍又一遍地使用相同的东西,请使用一种方法,尤其是跨项目时,请创建一个 Util 类。不知道行业标准是什么。 (有经验的程序员欢迎指正)

【讨论】:

  • 投反对票。 1.它不会提高可读性。 2. 它确实增加了严重的运行时开销。 3. Util 类通常是代码异味。
【解决方案7】:

搜索“java invert boolean function”时出现了这个答案。下面的示例将防止某些静态分析工具由于分支逻辑而导致构建失败。如果您需要反转布尔值并且没有构建全面的单元测试,这很有用;)

Boolean.valueOf(aBool).equals(false)

或者:

Boolean.FALSE.equals(aBool)

Boolean.FALSE::equals

【讨论】:

  • 我喜欢你可以将Boolean.FALSE::equals 传递给映射函数而不是编写一个小lambda
【解决方案8】:

BooleanUtils 类支持布尔值的否定。你可以在commons-lang:commons-lang找到这个课程

BooleanUtils.negate(theBoolean)

【讨论】:

    【解决方案9】:

    不幸的是,没有像数字这样的短形式有递增/递减:

    i++;

    我希望有类似的简短表达式来反转布尔值,dmth 像:

    是空的!;

    【讨论】:

    • 不知道为什么你在十二年前已经在这个帖子中回答了这个问题。
    猜你喜欢
    • 2016-06-09
    • 2011-04-23
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多