在Java中将boolean转换为int

hpi*_*que 328 java int casting boolean

什么是一个转换的最接受的方式booleanintJava中?

Jon*_*INE 549

int myInt = myBoolean ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

^^

PS:true = 1,false = 0

  • 在myBoolean代表布尔表达式的情况下,使用括号更具可读性. (58认同)
  • 是的,就像在`(foo &&(!bar || baz))?1:0` 显然,如果它只是一个标识符,则不需要或不需要. (38认同)
  • 更具可读性?只对未经训练的眼睛. (28认同)
  • 示例括号中的@Blrfl是*must*,而不是可读性问题.`foo &&(!bar || baz)?1:0`将是语法错误.(我知道已经6年了) (11认同)

Gro*_*uez 149

int val = b? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

  • 它也缺少一个空间,来吧! (15认同)
  • 从@Yirkha可以说出的有关这一行代码的所有事情中,您*不得不*抱怨毫无意义的空间?真? (2认同)

bar*_*jak 55

使用三元运算符是实现您想要的最简单,最有效和最可读的方式.我鼓励你使用这个解决方案.

但是,我无法抗拒提出一种替代的,人为的,低效的,不可读的解决方案.

int boolToInt(Boolean b) {
    return b.compareTo(false);
}
Run Code Online (Sandbox Code Playgroud)

嘿,人们喜欢投票给这么酷的答案!

编辑

顺便说一句,我经常看到从布尔到int的转换,其唯一目的是对两个值进行比较(通常,在compareTo方法的实现中).Boolean#compareTo是这些特定情况下的方法.

编辑2

Java 7引入了一个新的实用程序函数,它可以直接使用原始类型,Boolean#compare(谢谢shmosel)

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}
Run Code Online (Sandbox Code Playgroud)

  • 1.您可以使用`Boolean.compare()`并避免自动装箱.2."Boolean.compareTo()"的文档并没有说它将返回1,只有"如果此对象表示为true且参数表示为false则为正值". (4认同)
  • 我刚刚做了一个转换 1,000,000 个随机布尔值的测试,这种方法始终比基于三元运算符的方法快。它减少了大约 10 毫秒。 (3认同)
  • 将被现代 JIT 内联,因此不一定效率低下。它还记录了为什么使用 b.compareTo 因此它是可读的。 (2认同)
  • 它可能很慢,因为我们需要在对象中包装原始值.三元运算符方法直接使用原始值而无需转换,因此我认为它更有效. (2认同)
  • @AlexT.如果你做微基准测试,你应该使用一个框架来确保你正确测量.见http://openjdk.java.net/projects/code-tools/jmh/. (2认同)

Tho*_*sen 46

boolean b = ....; 
int i = -("false".indexOf("" + b));
Run Code Online (Sandbox Code Playgroud)

  • `5 - b.toString().length` (152认同)
  • 我认为这更适合作为评论,而不是答案. (12认同)
  • 我无法想象这是"最被接受的方式".确实有创意! (11认同)
  • @ThorbjørnRavnAndersen - 你以前参加过Perl混淆比赛吗?;) (11认同)
  • @ThorbjørnRavnAndersen我无法控制我的方法的使用方式或调用方式,这完全是重点.你牺牲了性能和可读性,绝对没有任何实际好处. (10认同)
  • 它绝对有创意,但我想不出使用这种方法的单一优势.它更冗长,而且(我猜)效率较低,但肯定是一种有趣的方法. (5认同)
  • @ThorbjørnRavnAndersen是的.使用其中一个更有效的方法发布,不需要开销.除非你能解释如何创建字符串对象以简单地检查布尔值是否有效. (4认同)
  • @ThorbjørnRavnAndersen微优化与它无关,因为它完全是上下文的问题.如果我使用此块调用方法1000000次,那么我可能会创建需要GC的1000000+额外对象.我不确定你的工作有多苛刻,但如果我尝试使用这样的东西,我的老板会把我拉到一边并给我一个wtf讲座. (4认同)
  • @ b1naryatr0phy你过早地进行了微观优化. (2认同)
  • @ b1naryatr0phy所以,如果我使用`Boolean.toString(b)`而不是``"+ b`来避免字符串连接,这对你来说没问题? (2认同)
  • @kennytm:很棒的黑客......但是很小的挑选:如果`b`是原始的`boolean`,我认为你需要使用:`5 - Boolean.toString(b).length` (2认同)

小智 26

public int boolToInt(boolean b) {
    return b ? 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

简单


小智 20

import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这个答案被贬低了这么多.如果你已经在使用apache commons,那么为什么不使用这个库! (5认同)
  • FWIW,`BooleanUtils.toInteger` 的实现只是 `return bool ? 1:0;`。 (5认同)
  • Apache Commons 可能很有用,但这太荒谬了。 (5认同)

Hen*_*ann 12

这取决于具体情况.通常最简单的方法是最好的,因为它很容易理解:

if (something) {
    otherThing = 1;
} else {
    otherThing = 0;
}
Run Code Online (Sandbox Code Playgroud)

要么

int otherThing = something ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

但有时使用Enum而不是布尔标志会很有用.假设存在同步和异步过程:

Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());
Run Code Online (Sandbox Code Playgroud)

在Java中,枚举可以有其他属性和方法:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

    private int code;
    private Process (int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用if而不是`?:`的另一个原因是你可以在if块中放置断点. (5认同)

tri*_*420 9

如果您使用Apache Commons Lang(我认为很多项目都使用它),您可以像这样使用它:

int myInt = BooleanUtils.toInteger(boolean_expression); 
Run Code Online (Sandbox Code Playgroud)

toInteger如果boolean_expression为true,则返回1 ,否则返回0

  • FWIW,`BooleanUtils.toInteger` 的实现只是 `return bool ? 1:0;`。 (2认同)

cod*_*ict 8

如果true -> 1false -> 0映射是你想要的,你可以这样做:

boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.
Run Code Online (Sandbox Code Playgroud)


mum*_*air 5

让我们玩把戏Boolean.compare(boolean, boolean)。函数的默认行为:如果两个值相等则返回0否则返回-1

public int valueOf(Boolean flag) {
   return Boolean.compare(flag, Boolean.TRUE) + 1;
}
Run Code Online (Sandbox Code Playgroud)

说明:正如我们所知,在不匹配的情况下,Boolean.compare 的默认返回值为 -1,因此 +1 使返回值为0 forFalse1 forTrue

  • `Boolean.compare(myBoolean, false)` 更适合引用的描述 (4认同)

Chr*_*oom 5

如果要混淆,请使用:

System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
Run Code Online (Sandbox Code Playgroud)