En expresiones lógicas, la parte restante se omitiría si no es necesaria
boolean b = false && checkSomething( something) //checkSomething() doesn't get called¿Cuál es una buena manera de lograr lo mismo con expresiones aritméticas?
int i = 0 * calculateSomethig ( something )Es posible agregar ifs antes de * . Pero, ¿hay una forma más elegante de resolver este problema? Sin agregar muchas cosas a la expresión, para que la expresión en sí se vea lo más cerca posible del original
¿Por qué no quiero usar ifs? desde
return calculateA() * calculateB()se volverá voluminoso y poco claro
int result int a = calculateA(); if (a!=0) { result = a*calculateB() }else{ result = 0 } return result¿Por qué me molesto con esto en absoluto? Porque los métodos de cálculo pueden ser costosos
&& y || se denominan operadores de cortocircuito porque no evalúan si la JVM encontrará el valor de la expresión completa sin evaluar la expresión completa. Por ejemplo, la JVM no tiene que evaluar la segunda parte de la siguiente expresión para indicar que se evalúa como true :
6 == (2 + 4) || 8 == 9 La JVM no tiene que evaluar todas las expresiones siguientes para indicar que se evalúa como false :
9 == 8 && 7 == 7 El operador de multiplicación (*) no es un operador de cortocircuito. Y así, no se comporta de esa manera. Puede hacer esto como mencionó usando declaraciones if . No hay una forma predefinida de hacer esto.
Puede crear una estructura que use lambdas para evaluar sus argumentos de forma perezosa:
class LazyMul implements IntSupplier { private final IntSupplier [] args; private LazyMul(IntSupplier[] args) { //argument checking omitted for brevity :) this.args = args; } public static LazyMul of(IntSupplier ... args) { return new LazyMul(args); } @Override public int getAsInt() { int res = 1; for (IntSupplier arg: args) { res *= arg.getAsInt(); if (res == 0) break; } return res; } } Por supuesto, esto es aún más largo, pero usarlo es tan simple como LazyMul.of(this::calculateA, this::calculateB) , por lo que si lo usa varias veces, es mejor que tener un if cada vez.
Desafortunadamente, con expresiones complicadas (particularmente anidadas), la legibilidad sufre, pero estas son las limitaciones de Java como lenguaje.