Passa una funzione come parametro in Java

Hassan Saeed 12 ottobre 2023
  1. Usa un’istanza di una interfaccia per passare una funzione come parametro in Java
  2. Usa java.lang.reflect.Method per passare una funzione come parametro in Java
Passa 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");
  }
}

Articolo correlato - Java Function