Como passar uma função como um parâmetro em Java

Hassan Saeed 12 outubro 2023
  1. Utilizar uma instância de uma interface para passar uma função como um parâmetro em Java
  2. Utilize java.lang.reflect.Method para passar uma função como parâmetro em Java
Como passar uma função como um 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");
  }
}

Artigo relacionado - Java Function