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.
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)
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){returnBoolean.compare(b,false);}
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.
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.
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:
publicstaticint booltoint(boolean nonsense){// Let's start with indenting using spaces, 16 of them to be preciseString[] ____int =newString[500];
____int[0]=Boolean.toString(nonsense);try{Thread.sleep(100);}catch(Exception e){}Random rand =newRandom();int n = rand.nextInt((int)1e9);int result =0;int other_Result =1;for(int i =-5; i <2; i++){try{if(n ==35467247)return5;// let's just fail with one in a billion chanceif((5- ____int[i].length())==1){return++result;}elseif(____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?Respostas:
^^
PS: verdadeiro = 1 e falso = 0
fonte
(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. Achomy
prefixo fez parecer uma variável.foo && (!bar || baz) ? 1 : 0
seria um erro de sintaxe. (Eu sei que tem sido 6 anos)fonte
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.
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 )fonte
Boolean.compare()
e evitar a caixa automática. 2. A documentação paraBoolean.compareTo()
não diz que retornará 1, apenas "um valor positivo se este objeto representar true e o argumento representar false".fonte
5 - b.toString().length
simples
fonte
fonte
BooleanUtils.toInteger
é implementado como justoreturn bool ? 1 : 0;
.Isso depende da situação. Geralmente, a abordagem mais simples é a melhor, porque é fácil de entender:
ou
Mas às vezes é útil usar um Enum em vez de um sinalizador booleano. Vamos imaginar que existem processos síncronos e assíncronos:
Em Java, o enum pode ter atributos e métodos adicionais:
fonte
?:
é 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:
toInteger
método retorna 1 seboolean_expression
for verdadeiro, 0 caso contráriofonte
BooleanUtils.toInteger
é implementado como justoreturn bool ? 1 : 0;
.Se
true -> 1
e ofalse -> 0
mapeamento é o que você deseja, você pode fazer:fonte
Se você deseja ofuscar, use o seguinte:
fonte
Vamos jogar truque com
Boolean.compare(boolean, boolean)
. Comportamento padrão da função: se os dois valores forem iguais, retornará o0
contrário-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
fonte
Boolean.compare(myBoolean, false)
caberia melhor de acordo com a descrição citadaO 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:
fonte
Então use:
fonte