Converter booleano em int em Java

350

Qual é a maneira mais aceita de converter um booleanpara um intem Java?

hpique
fonte
8
Quais números inteiros você acha que correspondem truee falserespectivamente?
Thorbjørn Ravn Andersen
4
Alguns idiomas têm conversão implícita de int para booleano. Java não. No entanto, a implementação oficial tem pacotes SQL, e eu acredito que estes converso "false" para 0.
hpique
4
@ Peter Lawrey Não, se você deseja interoperar com outros sistemas que não possuem booleano como um tipo de dados não numéricos.
Hpique 25/09/10
6
@ Peter Lawrey A questão não é realmente sobre o mapeamento de valores. É sobre como fazer a conversão da maneira mais clara e aceita.
Hpique 26/09/10
7
Tecnicamente, o compilador Java já define um mapeamento. Verdadeiro e Falso são compilados em 1 e 0, respectivamente.
Antimony

Respostas:

583
int myInt = myBoolean ? 1 : 0;

^^

PS: verdadeiro = 1 e falso = 0

Jonatha ANTOINE
fonte
59
No caso em que myBoolean representa uma expressão booleana, o uso de parênteses é mais legível.
RSP
40
Sim, como em (foo && (!bar || baz)) ? 1 : 0. Obviamente, se é apenas um identificador, as parênteses não são necessárias ou desejáveis.
Blrfl 25/09/10
belo truque com booleano! Eu estava olhando poderia algum exist fundição como (int) true = 1, mas observando existir assim: P
mumair
11
para iniciantes como eu, (boolean expression) ? 1 : 0;seria mais compreensível. Acho myprefixo fez parecer uma variável.
Dixhom 01/03
12
@Blrfl no seu exemplo entre parênteses é uma obrigação , não uma questão de legibilidade. foo && (!bar || baz) ? 1 : 0seria um erro de sintaxe. (Eu sei que tem sido 6 anos)
Konrad Morawski
150
int val = b? 1 : 0;
Grodriguez
fonte
resposta perfeita!
gaurav
59

Usar o operador ternário é a maneira mais simples, eficiente e legível de fazer o que você deseja. Convido você a usar esta solução.

No entanto, não consigo resistir a propor uma solução alternativa, artificial, ineficiente e ilegível.

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

Ei, as pessoas gostam de votar em respostas tão legais!

Editar

A propósito, eu frequentemente via conversões de um booleano para um int com o único objetivo de fazer uma comparação dos dois valores (geralmente, nas implementações do compareTométodo). Boolean#compareToé o caminho a seguir nesses casos específicos.

Editar 2

O Java 7 introduziu uma nova função de utilitário que trabalha diretamente com tipos primitivos Boolean#compare(Obrigado shmosel )

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}
barjak
fonte
11
Serão incorporados pelos JIT modernos, não necessariamente ineficientes. Também documenta por que o b.compareTo está sendo usado para facilitar a leitura.
Thorbjørn Ravn Andersen
2
Pode ser lento porque precisamos colocar o valor primitivo em um objeto. O método do operador ternário trabalha diretamente com valores primitivos sem conversão, então acho que é mais eficiente.
Barjak
5
1. Você pode usar Boolean.compare()e evitar a caixa automática. 2. A documentação para Boolean.compareTo()não diz que retornará 1, apenas "um valor positivo se este objeto representar true e o argumento representar false".
shmosel
11
Acabei de fazer um teste para converter 1.000.000 de valores booleanos aleatórios e esse método era consistentemente mais rápido que o baseado no operador ternário. Raspou cerca de 10ms.
Mapsy
3
@AlexT. se você usa marcas de micropigmentação, deve usar uma estrutura para garantir a medição correta. Consulte openjdk.java.net/projects/code-tools/jmh .
Thorbjørn Ravn Andersen
48
boolean b = ....; 
int i = -("false".indexOf("" + b));
Thorbjørn Ravn Andersen
fonte
14
Eu acho que isso seria mais adequado como comentário, não como resposta.
Hpique 25/09/10
164
5 - b.toString().length
Kennytm
5
@ ThorbjørnRavnAndersen Yeah. Usando um dos outros métodos mais eficientes publicados que não exigem essa sobrecarga. A menos que você possa explicar como a criação de objetos de string para simplesmente verificar o valor de um booleano é eficiente.
precisa saber é o seguinte
10
@ ThorbjørnRavnAndersen Não tenho controle sobre como meus métodos são usados ​​ou com que frequência são chamados, o que é exatamente o ponto. Você está sacrificando desempenho e legibilidade por absolutamente nenhum benefício tangível.
precisa saber é o seguinte
6
É definitivamente criativo, mas não consigo pensar em uma única vantagem em usar esse método. É mais detalhado e (eu acho) menos eficiente, mas com certeza é um método interessante.
21813 Mike Baxter
27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

simples

Adão
fonte
24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);
Darkeniel
fonte
FWIW, BooleanUtils.toIntegeré implementado como justo return bool ? 1 : 0;.
Solomon Ucko 27/02
O Apache Commons pode ser útil, mas isso é ridículo.
Eric Duminil
14

Isso depende da situação. Geralmente, a abordagem mais simples é a melhor, porque é fácil de entender:

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

ou

int otherThing = something ? 1 : 0;

Mas às vezes é útil usar um Enum em vez de um sinalizador booleano. Vamos imaginar que existem processos síncronos e assíncronos:

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

Em Java, o enum pode ter atributos e métodos adicionais:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}
Hendrik Brummermann
fonte
6
Um motivo adicional para usar um if em vez de ?:é que você pode colocar pontos de interrupção dentro dos blocos if.
Thorbjørn Ravn Andersen
12

Se você usa o Apache Commons Lang (que eu acho que muitos projetos o usam), você pode usá-lo assim:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegermétodo retorna 1 se boolean_expressionfor verdadeiro, 0 caso contrário

triForce420
fonte
FWIW, BooleanUtils.toIntegeré implementado como justo return bool ? 1 : 0;.
Solomon Ucko 27/02
8

Se true -> 1e o false -> 0mapeamento é o que você deseja, você pode fazer:

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

Se você deseja ofuscar, use o seguinte:

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

Vamos jogar truque com Boolean.compare(boolean, boolean). Comportamento padrão da função: se os dois valores forem iguais, retornará o 0contrário -1.

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

Explicação : Como sabemos padrão de retorno de Boolean.compare é -1 em caso de mis-match tão valor de retorno +1 make a 0 para o Falsee 1 paraTrue

mumair
fonte
3
Boolean.compare(myBoolean, false)caberia melhor de acordo com a descrição citada
Vadzim
@Vadzim Sim, de fato, gerará 1 e 0 comparando com false e, no cenário atual, gerará 0 e -1. Ambas as soluções são muito bem e +1 para o seu comentário :-)
mumair
0

O fato de eu ter que escrever um método wrapper em torno de uma instrução if para converter um valor apenas adiciona à já enorme lista de razões pelas quais o java já deve morrer. E ver o operador ternário nem mesmo envolvido em uma função, mas apenas copiar colado em todos os lugares, vejo uma conversão booleana para int apenas me deixa louco. É um desperdício de ciclos da CPU e um insulto à legibilidade do código.

Além disso, a maioria das respostas aqui tem centenas de votos positivos com nenhuma explicação, o que me faz supor que a prática inadequada é apenas o resultado de ter sido exposta tanto ao java. Se eu escrevesse um operador ternário para converter booleano para int em qualquer linguagem moderna, seria demitido no dia seguinte de qualquer trabalho que pudesse ter. Hoje, desisti de tentar empregar a razão nas minhas tarefas em java e decidi adotar a estupidez:

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;}
MuhsinFatih
fonte
-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

Então use:

convBool(aBool);
Regis_AG
fonte