如何在 Java 中將函式作為引數傳遞

Hassan Saeed 2023年1月30日 2020年9月26日
  1. 在 Java 中使用一個 interface 的例項來傳遞一個函式作為引數
  2. 在 Java 中使用 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 中使用 java.lang.reflect.Method 傳遞一個函式作為引數

我們有一個函式 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");
    }
}

相關文章 - Java Function