Como passar uma função como um parâmetro em Java
-
Utilizar uma instância de uma
interface
para passar uma função como um parâmetro em Java -
Utilize
java.lang.reflect.Method
para passar uma função como parâmetro em Java
Este tutorial discutirá como passar uma função como parâmetro para outra função em Java.
Discutiremos dois métodos diferentes para passar uma função como um parâmetro em Java.
Utilizar uma instância de uma interface
para passar uma função como um parâmetro em Java
Neste método, você precisa escrever a função que você precisa passar como parâmetro em uma classe implementando uma interface contendo apenas o esqueleto desse método.
O exemplo abaixo ilustra isto.
Definimos uma interface Callable
que contém o esqueleto da função que planejamos passar como parâmetro. Em seguida, definimos uma classe que implementa a Callable
e inclui a definição completa da função. Esta função pode ser passada para outra função como newFunction(Callable callable, int param)
onde callable
representa uma instância da interface Callable
.
Um exemplo completo de funcionamento é mostrado no código abaixo.
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
Utilize java.lang.reflect.Method
para passar uma função como parâmetro em Java
Temos uma função functionToPass
que precisamos passar como parâmetro para a função outerFunction
.
Não há diferença em como definimos functionToPass
; entretanto, precisamos seguir uma sintaxe específica para definir a outerFunction
: outerFunction(Object object, Method method, param1, param2, ...)
.
Dê uma olhada no exemplo abaixo:
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");
}
}
Aqui está outro exemplo do mesmo método. Estamos criando uma função que também tem um 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");
}
}