如何在 Java 中將函式作為引數傳遞
Hassan Saeed
2023年1月30日
2020年9月26日
本教程將討論如何在 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
的方式沒有什麼不同,但是,我們需要按照特定的語法來定義 outerFunction
:outerFunction(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");
}
}