Cómo pasar una función como parámetro en Java
-
Usar una instancia de una
interface
para pasar una función como parámetro en Java -
Usa el
java.lang.reflect.Method
para pasar una función como parámetro en Java
Este tutorial discutirá cómo pasar una función como parámetro a otra función en Java.
Discutiremos dos métodos diferentes para pasar una función como parámetro en Java.
Usar una instancia de una interface
para pasar una función como parámetro en Java
En este método, hay que escribir la función que hay que pasar como parámetro en una clase que implemente una interfaz que contenga sólo el esqueleto de ese método.
El siguiente ejemplo lo ilustra.
Definimos una interfaz Callable
que contiene el esqueleto de la función que planeamos pasar como parámetro. A continuación, definimos una clase que implementa Callable
e incluye la definición completa de la función. Esta función puede ser pasada a otra función como newFunction(Callable callable, int param)
donde callable
representa una instancia de la interfaz Callable
.
Un ejemplo completo de funcionamiento se muestra en el código de abajo.
interface Callable {
public void call(int param);
}
class Test implements Callable {
public void call(int param) {
System.out.println(param);
}
}
public class HelloWorld {
public static void invoke(Callable callable, int param) {
callable.call(param);
}
public static void main(String[] args) {
Callable cmd = new Test();
invoke(cmd, 10);
}
}
Resultado:
> 10
Usa el java.lang.reflect.Method
para pasar una función como parámetro en Java
Tenemos una función functionToPass
que necesitamos pasar como parámetro a la función outerFunction
.
No hay diferencia en cómo definimos functionToPass
; sin embargo, necesitamos seguir una sintaxis específica para definir la outerFunction
: outerFunction(Object object, Method method, param1, param2, ...)
.
Echa un vistazo al siguiente ejemplo:
import java.lang.reflect.Method;
public class Main {
public void functionToPass(String message) {
String[] split = message.split(" ");
for (int i = 0; i < split.length; i++) System.out.println(split[i]);
}
public void outerFunction(Object object, Method method, String message) throws Exception {
Object[] parameters = new Object[1];
parameters[0] = message;
method.invoke(object, parameters);
}
public static void main(String[] args) throws Exception {
Class[] parameterTypes = new Class[1];
parameterTypes[0] = String.class;
Method functionToPass = Main.class.getMethod("functionToPass", parameterTypes[0]);
Main main = new Main();
main.outerFunction(main, functionToPass, "This is the input");
}
}
Aquí hay otro ejemplo del mismo método. Estamos creando una función que también tiene un valor de retorno.
import java.lang.reflect.Method;
public class Main {
public int functionToPass(String message) {
return message.length();
}
public void outerFunction(Object object, Method method, String message) throws Exception {
Object[] parameters = new Object[1];
parameters[0] = message;
System.out.println(method.invoke(object, parameters));
}
public static void main(String[] args) throws Exception {
Class[] parameterTypes = new Class[1];
parameterTypes[0] = String.class;
Method functionToPass = Main.class.getMethod("functionToPass", parameterTypes[0]);
Main main = new Main();
main.outerFunction(main, functionToPass, "This is the input");
}
}