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

Hassan Saeed 2023年10月12日
  1. Java で関数をパラメータとして渡すために interface のインスタンスを使用する
  2. Java で関数をパラメータとして渡すには java.lang.reflect.Method を使用する
Java で関数をパラメータとして渡す方法

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

関連記事 - Java Function