Passa una funzione come parametro in Java
-
Usa un’istanza di una
interfaccia
per passare una funzione come parametro in Java -
Usa
java.lang.reflect.Method
per passare una funzione come parametro in Java
Questo tutorial discuterà come passare una funzione come parametro a un’altra funzione in Java.
Discuteremo due diversi metodi per passare una funzione come parametro in Java.
Usa un’istanza di una interfaccia
per passare una funzione come parametro in Java
In questo metodo, è necessario scrivere la funzione che è necessario passare come parametro in una classe che implementa un’interfaccia contenente solo lo scheletro di quel metodo.
L’esempio seguente lo illustra.
Definiamo un’interfaccia Callable
che contiene lo scheletro della funzione che intendiamo passare come parametro. Successivamente, definiamo una classe che implementa Callable
e include la definizione completa della funzione. Questa funzione può essere passata ad un’altra funzione come newFunction(Callable callable, int param)
dove callable
rappresenta un’istanza dell’interfaccia Callable
.
Un esempio di lavoro completo è mostrato nel codice seguente.
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);
}
}
Produzione:
> 10
Usa java.lang.reflect.Method
per passare una funzione come parametro in Java
Abbiamo una funzione functionToPass
che dobbiamo passare come parametro alla funzione outerFunction
.
Non c’è differenza nel modo in cui definiamo functionToPass
; tuttavia, dobbiamo seguire una sintassi specifica per definire la outerFunction
: outerFunction(Object object, Method method, param1, param2, ...)
.
Dai un’occhiata all’esempio qui sotto:
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");
}
}
Ecco un altro esempio dello stesso metodo. Stiamo creando una funzione che ha anche un valore di ritorno.
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");
}
}