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 ivariável
x = 5; Expressão cujo tipo é igual ao tipo da xvariá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
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

Em segundo lugar, se quisermos, podemos ignorar o resultado da avaliação de uma expressão.

Código Código onde ignoramos o resultado:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

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-elseinstruçã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-elsedeclaraçã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-elseinstrução:

int age = 25;
int money = age > 30 ? 100 : 50;

Então, o que é melhor usar — ​​uma if-elseinstruçã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-elseinstruçã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");