Argumentos variables (varargs)
En ocasiones en necesario implementar funciones con una única definición y preparar para múltiples argumentos para procesarse. Es posible crear, por medio de sobrecarga de funciones, múltiples versiones de la misma función.
public class PromedioSobrecarga {
public static double calcularPromedio(double numero1, double numero2) {
return (numero1 + numero2) / 2.0;
}
public static double calcularPromedio(double[] numeros) {
if (numeros.length == 0) {
return 0.0;
}
double suma = 0;
for (double num : numeros) {
suma += num;
}
return suma / numeros.length;
}
public static void main(String[] args) {
double[] numeros = {5.0, 10.0, 15.0};
double promedio1 = calcularPromedio(numeros);
System.out.println("El promedio es: " + promedio1); // Salida: El promedio es: 10.0
double promedio2 = calcularPromedio(2.5, 7.5);
System.out.println("El promedio es: " + promedio2); // Salida: El promedio es: 5.0
}
}
Hay dos versiones, la primera con 2 argumentos y la segunda con un array alimentando la función. La versión con array puede manipular diferente cantidad de datos, pero es necesario crear el objeto antes de llamar a la función.
Es posible implementar el mismo cuerpo del array, utilizando como argumentos valores individuales, donde no es necesario crear un objeto de tipo array. A esto se le denomina argumentos variables o varargs.
public class PromedioVarargs {
public static double calcularPromedio(double... numeros) {
if (numeros.length == 0) {
return 0.0;
}
double suma = 0;
for (double num : numeros) {
suma += num;
}
return suma / numeros.length;
}
public static void main(String[] args) {
double promedio1 = calcularPromedio(5.0, 10.0, 15.0);
System.out.println("El promedio es: " + promedio1); // Salida: El promedio es: 10.0
double promedio2 = calcularPromedio(2.5, 7.5);
System.out.println("El promedio es: " + promedio2); // Salida: El promedio es: 5.0
double promedio3 = calcularPromedio(); // Llamada sin argumentos
System.out.println("El promedio es: " + promedio3); // Salida: El promedio es: 0.0
}
}
Expresión Lambda
Las expresiones lambda son una característica importante y poderosa introducida en Java 8 que permite definir funciones anónimas de una manera más concisa y elegante. Se utilizan principalmente para implementar interfaces funcionales, que son interfaces que contienen un solo método abstracto.
También es posible utilizar una expresión lambda como una función de primera clase, es decir, que permite que se comporte un objeto. Con lo cual es posible asignar y pasar como un argumento de otra función.
(int a, int b) -> a + b
Para implementar la anterior expresión lambda debe incluir la definición de una Interface donde esté definida las reglas para implementar dicha expresión lambda.
@FunctionalInterface
interface Calculadora {
double ejecutar(double a, double b);
}
public class Test {
static Calculadora suma = (a, b) -> a + b;
public static void main(String[] args) {
System.out.println("La suma es " + Test.suma.ejecutar(1, 2));
}
}
Al emplear una Interface para generar expresiones lambda, se puede agregar la anotación @FuncionalInterface para obligar a la Interface a definir un solo método.