Java で関数をパラメータとして渡す方法
Hassan Saeed
2023年10月12日
このチュートリアルでは、Java で関数をパラメータとして別の関数に渡す方法について説明します。
Java で関数をパラメータとして渡す 2つの異なる方法について説明します。
Java で関数をパラメータとして渡すために interface
のインスタンスを使用する
このメソッドでは、そのメソッドのスケルトンのみを含むインターフェースを実装したクラスに、パラメータとして渡す必要のある関数を書く必要があります。
以下の例はこれを示しています。
パラメータとして渡す予定の関数のスケルトンを含むインターフェイス Callable
を定義します。次に、Callable
を実装し、関数の完全な定義を含むクラスを定義します。この関数は newFunction(Callable callable, int param)
のような別の関数に渡すことができます。
完全な動作例を以下のコードに示します。
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 object, Method 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");
}
}