在Java中切换布尔变量的最简洁方法?


211

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

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

哦,很高兴,我将要问同样的问题,尽管我想我的问题通常是针对javascript / as3或ECMAScript的,但这个问题很容易解决。
matt lohkamp,09年

如果没有!运算子??
onmyway133 2014年

Answers:


536
theBoolean = !theBoolean;

16
真的很明显-糟糕!不知道为什么我没有想到。谢谢。
凯文·格里芬

!布尔值似乎是很自然的选择-也许在将来。
matt lohkamp,09年

21
@ypnos: !!bool == !(!(bool)) == bool
ChristofferHammarström,

12
@ChristofferHammarström通过这种逻辑,那么--integer ==-(-(-integer))== integer是否应该?
user515655

1
@ user515655-语言定义了一个--运算符(实际上,其中两个,还有两个++运算符),但是没有定义一个!!运算符。如果需要-(-(integer)),可以在两个-字符之间使用空格。但是不管空白如何,都!!解析为两个!运算符。
泰德·霍普

164
theBoolean ^= true;

如果变量大于四个字母,则击键次数更少

编辑:当用作Google搜索字词时,代码往往会返回有用的结果。上面的代码没有。对于那些谁需要它,它是按位异或这里所描述


14
并且符合DRY :)
Tetha

6
精简是机智的灵魂。
保罗·布林克利

7
现在我可以随意使用名称删除(语法删除?)XOR在我的程序员朋友面前看起来很酷。您的答案应该与所选的答案融合在一起,它们完全是完美的。
matt lohkamp,09年

6
@ScottStanchfield这样的人应该学习它。这一点都不难,也不是hack,并且不知道它通常会导致糟糕的代码,例如这个问题。这真是大爆炸-使用标准约定的5行!
maaartinus 2014年

4
此操作也比其他版本(theBoolean = !theBoolean;theBoolean = theBoolean ? false : true;
Blaine Kasten

32

有几个

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

theBoolean = !theBoolean;

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

theBoolean ^= true;

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

theBoolean = theBoolean ? false : true;

附加:切换并在方法调用中使用

theMethod( theBoolean ^= true );

由于赋值运算符总是返回已赋值的内容,因此这将通过按位运算符来切换值,然后返回将在方法调用中使用的新赋值。


用称为切换的函数/方法包装实现,然后几乎没有办法混淆它。
Lambage

@Reiner:C绝对可以,但是Java不允许将布尔值和整数混合使用(while(1)Java 也不可能这样)。
莱维特

@Lambage:是的,但是在不利的方面,您不能仅通过传递布尔值来切换布尔值,因为在Java中无法通过引用传递基元。您将不得不将方法的结果重新分配给变量,或者以其他方式为布尔值创建包装器类。
莱维特

上面的“明显方式”被SONAR标记为-内部分配。
奥比

2

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

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并在方法中进行切换(但仍然有些含糊)。
莱维特

2

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

Boolean.valueOf(aBool).equals(false)

或者:

Boolean.FALSE.equals(aBool)

要么

Boolean.FALSE::equals

1
我喜欢这样的事实,您可以传递Boolean.FALSE::equals给映射函数,而不用编写一点lambda
Patrick Parker

0

如果您没有做任何特别专业的事情,则可以始终使用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类。但是,Dunno的行业标准是什么。(经验丰富的程序员可以随时纠正我)



-4

之前:

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

后:

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

谁曾投票反对?还可以请您解释一下原因吗?
Nikhil Kumar 2015年

11
我能想到为什么有人可能会否决您的两个主要原因:1)线程坏死(加油!这个问题是在7(!)年前问的!),您的回答并没有带来新的结果;2)选民希望得到“更清洁”的东西(阅读:较短)-AaronMaenpaa的回答就是一个很好的例子。
Priidu Neemre

5
@Elltz:相反-我实际上已经投票支持他,因为从技术上讲答复是正确的。但是,我必须说,我不喜欢以低廉的业力来窃听先前用户的答复(请参阅nlaq的回答)。
Priidu Neemre

@PriiduNeemre,在7年以上之前已接受提问和回答,您是否认为除了您的名单以外,任何人都将放弃投票?除此之外,您的答案也没有达到标准。.:(
::

2
after:布尔结果=!isresult();
皮特·弗里伯格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.