Java で関数をパラメータとして渡す方法

  1. Java で関数をパラメータとして渡すために interface のインスタンスを使う
  2. Java で関数をパラメータとして渡すには java.lang.reflect.Method を使う

このチュートリアルでは、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");
    }
}
comments powered by Disqus