如何在 Java 中将函数作为参数传递

  1. 在 Java 中使用一个 interface 的实例来传递一个函数作为参数
  2. 使用 java.lang.reflect.Method 在 Java 中传递一个函数作为参数

本教程将讨论如何在 Java 中把一个函数作为参数传递给另一个函数。

我们将讨论两种不同的方法来传递一个函数作为 Java 中的参数。

在 Java 中使用一个 interface 的实例来传递一个函数作为参数

在这个方法中,你需要在实现一个只包含该方法框架的接口的类中写出你需要传递的函数作为参数。

下面的例子就说明了这一点。

我们定义了一个接口 Callable,它包含了我们打算作为参数传递的函数骨架。接下来,我们定义一个实现 Callable 的类,它包含了函数的完整定义。这个函数可以传递给另一个函数,比如 newFunction(Callable callable, int param),其中 callable 代表接口 Callable 的一个实例。

一个完整的工作示例在下面的代码中显示。

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);

    }
}

输出:

> 10

使用 java.lang.reflect.Method 在 Java 中传递一个函数作为参数

我们有一个函数 functionToPass,我们需要将其作为参数传递给函数 outerFunction

我们定义 functionToPass 的方式没有什么不同,但是,我们需要按照特定的语法来定义 outerFunctionouterFunction(Object 对象,Method 方法,param1,param2,...)

请看下面的例子:

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");
    }
}

下面是另一个相同方法的例子。我们正在创建一个也有返回值的函数。

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");
    }
}
comments powered by Disqus