1. Expressões versus declarações
Em Java, é útil distinguir entre duas categorias: instruções e expressões . Normalmente, diz-se que uma instrução é executada , enquanto uma expressão é considerada avaliada . Mas isso não é o mais importante.
A principal diferença entre uma instrução e uma expressão é que a avaliação de uma expressão tem um resultado . E esse resultado tem um tipo, e pode ser atribuído a uma variável ou usado em alguma outra expressão.
Exemplos:
Código | Notas |
---|---|
int x; |
Declaração |
(a < 10) |
Expressão cujo tipo éboolean |
i++; |
Expressão cujo tipo é igual ao tipo da i variável |
x = 5; |
Expressão cujo tipo é igual ao tipo da x variável |
E o que isso nos dá?
Primeiro, podemos tirar proveito do fato de que muitas instruções são, na verdade, expressões (o que significa que são avaliadas como um valor). Por exemplo, um código como este funcionará:
Código | Notas |
---|---|
|
|
Em segundo lugar, se quisermos, podemos ignorar o resultado da avaliação de uma expressão.
Código | Código onde ignoramos o resultado: |
---|---|
|
|
Ignoramos o resultado da avaliação de uma expressão, por exemplo, se a expressão envolve fazer algo útil, e essa ação é o que é importante para nós, não o resultado em si.
2. Operador ternário
Este life hack já é mais interessante que o anterior. Java tem um operador ternário especial . Sua sintaxe é um pouco semelhante à sintaxe da instrução:if-else
Condition ? Expression 1 : Expression 2;
Se a condição for verdadeira, a Expressão 1 é avaliada, caso contrário, a Expressão 2 é avaliada. A condição é seguida por um ponto de interrogação e as duas expressões são separadas por dois pontos .
A principal diferença entre o operador ternário e uma if-else
instrução é que o operador ternário é uma expressão, o que significa que podemos atribuir seu resultado a algo.
Por exemplo, suponha que queremos calcular o mínimo de dois números. Usando o operador ternário, esse código ficaria assim:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Ou digamos que você precise atribuir valores diferentes a uma variável dependendo de alguma condição. Como você faz isso?
Uma opção é usar uma if-else
declaração:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
A segunda opção é utilizar o operador ternário , ou seja, abreviação da if-else
instrução:
int age = 25;
int money = age > 30 ? 100 : 50;
Então, o que é melhor usar — uma if-else
instrução ou o operador ternário ? Em termos de velocidade de execução, não há muita diferença. Isso é mais uma questão de legibilidade do código. E este é um ponto muito importante: o código não deve apenas funcionar corretamente, mas também ser fácil de ler para outros programadores.
A regra mais simples é esta: se o código couber em uma linha , use o operador ternário ; mas se não couber em uma linha, é melhor usar uma if-else
instrução.
3. Comparando números reais
Como mencionado anteriormente, você não pode simplesmente pegar números reais e compará-los. Sempre existe a possibilidade de alguns dígitos significativos serem descartados, causando efeitos colaterais inesperados.
É por isso que existe uma abordagem testada pelo tempo. Se dois números reais diferem por um valor muito pequeno, eles podem ser considerados iguais. Exemplo:
double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
Mas não é só com isso que temos que nos preocupar, já que a diferença entre os números pode acabar sendo negativa. Portanto, para que essa abordagem funcione, você precisa comparar não apenas a diferença entre os números, mas o valor absoluto da diferença entre os números:|a-b|
Java tem um método para calcular o valor absoluto de um número: Math.abs()
:
int m = Math.abs(value);
Como resultado, a versão corrigida do nosso exemplo acima ficará assim:
double a = 1.000001;
double b = 1.000002;
if ( Math.abs(b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
GO TO FULL VERSION