Qual é a maneira mais aceita de converter um boolean
para um int
em Java?
Qual é a maneira mais aceita de converter um boolean
para um int
em Java?
Respostas:
int myInt = myBoolean ? 1 : 0;
^^
PS: verdadeiro = 1 e falso = 0
(foo && (!bar || baz)) ? 1 : 0
. Obviamente, se é apenas um identificador, as parênteses não são necessárias ou desejáveis.
(boolean expression) ? 1 : 0;
seria mais compreensível. Acho my
prefixo fez parecer uma variável.
foo && (!bar || baz) ? 1 : 0
seria um erro de sintaxe. (Eu sei que tem sido 6 anos)
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 compareTo
mé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);
}
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".
boolean b = ....;
int i = -("false".indexOf("" + b));
5 - b.toString().length
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;
int y= BooleanUtils.toInteger(x);
BooleanUtils.toInteger
é implementado como justo return bool ? 1 : 0;
.
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;
}
}
?:
é que você pode colocar pontos de interrupção dentro dos blocos if.
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);
toInteger
método retorna 1 se boolean_expression
for verdadeiro, 0 caso contrário
BooleanUtils.toInteger
é implementado como justo return bool ? 1 : 0;
.
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
Vamos jogar truque com Boolean.compare(boolean, boolean)
. Comportamento padrão da função: se os dois valores forem iguais, retornará o 0
contrá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 False
e 1 paraTrue
Boolean.compare(myBoolean, false)
caberia melhor de acordo com a descrição citada
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;}
true
efalse
respectivamente?