1. Expresiones vs declaraciones

En Java, es útil distinguir entre dos categorías: sentencias y expresiones . Por lo general, se dice que se ejecuta una declaración , mientras que se dice que se evalúa una expresión . Pero eso no es lo más importante.

La principal diferencia entre un enunciado y una expresión es que evaluar una expresión tiene un resultado . Y este resultado tiene un tipo, y puede asignarse a una variable o usarse en alguna otra expresión.

Ejemplos:

Código notas
int x; Declaración
(a < 10) Expresión cuyo tipo esboolean
i++; Expresión cuyo tipo es el mismo que el tipo de la ivariable
x = 5; Expresión cuyo tipo es el mismo que el tipo de la xvariable

¿Y qué nos da esto?

Primero, podemos aprovechar el hecho de que muchas declaraciones son en realidad expresiones (lo que significa que se evalúan como un valor). Por ejemplo, un código como este funcionará:

Código notas
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

Segundo, si queremos, podemos ignorar el resultado de evaluar una expresión.

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

Ignoramos el resultado de evaluar una expresión, por ejemplo, si la expresión implica hacer algo útil, y esta acción es lo que nos importa, no el resultado en sí.


2. Operador ternario

Este truco de la vida ya es más interesante que el anterior. Java tiene un operador ternario especial . Su sintaxis es algo similar a la sintaxis de la declaración:if-else

Condition ? Expression 1 : Expression 2;

Si la condición es verdadera, se evalúa la Expresión 1 ; de lo contrario , se evalúa la Expresión 2 . La condición va seguida de un signo de interrogación y las dos expresiones están separadas por dos puntos .

La principal diferencia entre el operador ternario y una if-elsedeclaración es que el operador ternario es una expresión, lo que significa que podemos asignar su resultado a algo.

Por ejemplo, supongamos que queremos calcular el mínimo de dos números. Usando el operador ternario, este código se vería así:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

O, digamos que necesita asignar diferentes valores a una variable dependiendo de alguna condición. ¿Cómo haces eso?

Una opción es usar una if-elsedeclaración:

int age = 25;
int money;
if (age > 30)
   money = 100;
else
   money = 50;

La segunda opción es usar el operador ternario , es decir, abreviatura de la if-elsedeclaración:

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

Entonces, ¿qué es mejor usar: una if-elsedeclaración o el operador ternario ? En términos de velocidad de ejecución, no hay mucha diferencia. Esto es más una cuestión de legibilidad del código. Y este es un punto muy importante: el código no solo debe funcionar correctamente, sino que también debe ser fácil de leer para otros programadores.

La regla más simple es esta: si el código cabe en una línea , entonces use el operador ternario ; pero si no cabe en una línea, entonces es mejor usar una if-elsedeclaración.



3. Comparar números reales

Como se mencionó anteriormente, no puede simplemente tomar números reales y compararlos. Siempre existe la posibilidad de que se descarten algunos dígitos significativos, lo que provocaría efectos secundarios inesperados.

Es por eso que existe un enfoque probado en el tiempo. Si dos números reales difieren en un valor muy pequeño, entonces pueden considerarse iguales. Ejemplo:

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");

Pero eso no es todo lo que nos debe preocupar, ya que la diferencia entre los números bien puede resultar negativa. Entonces, para que este enfoque funcione, debe comparar no solo la diferencia entre los números, sino también el valor absoluto de la diferencia entre los números:|a-b|

Java tiene un método para calcular el valor absoluto de un número Math.abs():

int m = Math.abs(value);

Como resultado, la versión corregida de nuestro ejemplo anterior se verá así:

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");