在Java中将布尔值转换为int


350

在Java中将a转换boolean为an 的最常用方法是什么int


8
您认为分别对应于true和的整数是什么false
托尔比约恩Ravn的安徒生

4
一些语言具有从int到boolean的隐式转换。Java没有。然而,正式实施了SQL包,我相信这些转换“假”为0
hpique

4
@Peter Lawrey如果您想与其他没有布尔值作为非数字数据类型的系统进行互操作,则不需要。
hpique 2010年

6
@Peter Lawrey问题实际上与价值映射无关。它是关于如何以最清晰,可接受的方式进行转换的。
hpique 2010年

7
从技术上讲,Java编译器已经定义了一个映射。True和False分别编译为1和0。
锑2012年

Answers:


583
int myInt = myBoolean ? 1 : 0;

^^

PS:真= 1,假= 0


59
在myBoolean表示布尔表达式的情况下,使用括号更易读。
rsp 2010年

40
是的,如中所示(foo && (!bar || baz)) ? 1 : 0。显然,如果只是标识符,则不需要或不需要括号。
Blrfl 2010年

布尔的好技巧!我一直在寻找可能存在一些像(int)true = 1的强制转换,但注意到这样的存在:P
mumair 2015年

1
对于像我(boolean expression) ? 1 : 0;这样的初学者,会更容易理解。我认为my前缀使它看起来像一个变量。
dixhom

12
您的示例括号中的@Blrfl是必须的,而不是可读性。 foo && (!bar || baz) ? 1 : 0将是语法错误。(我知道已经6年了)
Konrad Morawski '16


59

使用三元运算符是最简单,最有效和最易读的方式来执行所需的操作。我鼓励您使用此解决方案。

但是,我忍不住提出一个替代的,人为的,低效的,不可读的解决方案。

int boolToInt(Boolean b) {
    return b.compareTo(false);
}

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

编辑

顺便说一句,我经常看到从布尔值到整数的转换,其唯一目的是比较两个值(通常在compareTo方法的实现中)。Boolean#compareTo在这些特定情况下应该采取的方法。

编辑2

Java 7引入了一个新的实用程序功能,该功能可以直接与原始类型一起使用Boolean#compare(感谢shmosel

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}

1
将由现代JIT内联,因此不一定效率低下。它还记录了为什么使用b.compareTo以便可读。
托尔比约恩Ravn的安德森

2
这很慢,因为我们需要在对象中装箱原始值。三元运算符方法无需转换即可直接使用原始值,因此我认为它更有效。
barjak 2011年

5
1.您可以使用Boolean.compare()并避免自动装箱。2. for的文档Boolean.compareTo()没有说它将返回1,只是“如果此对象表示true,而参数表示false,则为正值”。
shmosel 2014年

1
我刚刚进行了一个转换1,000,000个随机布尔值的测试,并且该方法始终比基于三元运算符的方法快。它缩短了约10ms。
Mapsy 2014年

3
@AlexT。如果您进行微基准测试,则应使用一个框架来确保您进行正确的测量。参见openjdk.java.net/projects/code-tools/jmh
托尔比约恩Ravn的安徒生

48
boolean b = ....; 
int i = -("false".indexOf("" + b));

14
我认为这更适合作为评论,而不是答案。
hpique 2010年

164
5 - b.toString().length
kennytm 2010年

5
@ThorbjørnRavnAndersen是的。使用其他更有效的方法之一发布,不需要这些开销。除非您能解释创建字符串对象以简单地检查布尔值的方式,否则无论如何都是有效的。
b1nary.atr0phy 2013年

10
@ThorbjørnRavnAndersen我无法控制我的方法的使用方式或调用的频率,这完全是重点。您在牺牲性能和可读性的同时绝对没有任何明显的好处。
b1nary.atr0phy 2013年

6
它绝对具有创造力,但我想不出使用这种方法的单一优势。它比较冗长,效率较低,但肯定是一种有趣的方法。
Mike Baxter 2013年

27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

简单



14

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

if (something) {
    otherThing = 1;
} else {
    otherThing = 0;
}

要么

int otherThing = something ? 1 : 0;

但是有时使用枚举而不是布尔标志很有用。假设有同步和异步过程:

Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());

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

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}

6
使用if代替的另一个原因?:是可以将断点放在if块内。
托尔比约恩Ravn的安德森

12

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

int myInt = BooleanUtils.toInteger(boolean_expression); 

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


FWIW BooleanUtils.toInteger仅实现为return bool ? 1 : 0;
所罗门·乌科

8

如果您想使用true -> 1false -> 0映射,则可以执行以下操作:

boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.

6

如果要混淆,请使用以下命令:

System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0

3

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

public int valueOf(Boolean flag) {
   return Boolean.compare(flag, Boolean.TRUE) + 1;
}

说明:我们知道Boolean.compare的默认返回-1在不匹配的情况下,这样+1化妆返回值为0False1True


3
Boolean.compare(myBoolean, false)会更适合引用的描述
Vadzim

@Vadzim是的,通过与false比较确实会生成1和0,在当前情况下,它将生成0和-1。两种解决方案都不错,并为您的评论+1 :-)
mumair

0

我必须围绕if语句编写一个包装方法来强制转换值,这一事实增加了Java应该已经死掉的原因。看到三元运算符甚至没有包装在函数中,而是复制粘贴到了所有地方,我看到布尔值转换为int会使我发疯。这浪费了cpu周期,并且侮辱了代码的可读性。

同样,这里的大多数答案都有数百个带有零解释的反对,这使我猜测不良实践仅仅是暴露于Java过多的结果。如果我写了一个三元运算符,用任何现代语言将boolean转换为int,第二天我可能会被解雇。所以今天我放弃了尝试在我的Java作业中运用推理,并决定接受愚蠢:

public static int booltoint(boolean nonsense) {
                                // Let's start with indenting using spaces, 16 of them to be precise
                                String[] ____int = new String[500];
                                ____int[0] = Boolean.toString(nonsense);
                                try {
                                                Thread.sleep(100); 
                                } catch (Exception e) {    }
                                Random rand = new Random();
                                int n = rand.nextInt((int)1e9);
                                int result = 0;
                                int other_Result = 1;
                                for (int i = -5; i < 2; i++) {
                                                try {
                                                                if (n == 35467247) return 5; // let's just fail with one in a billion chance
                                                                if ((5 - ____int[i].length()) == 1) {
                                                                                return ++result;
                                                                } else if(____int[i] == "false") {
                                                                                return --other_Result;
                                                                }
                                                } catch (Exception e) {
                                                                // This method will throw an exception 5 times every single time I 
                                                                // cast a boolean to int before returning an integer
                                                }
                                }
                                return (int)1e35;}

-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

然后使用:

convBool(aBool);
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.