Javaで関数をパラメータとして渡すにはどうすればいいですか? [重複] 質問する

Javaで関数をパラメータとして渡すにはどうすればいいですか? [重複] 質問する

Java では、関数を別の関数の引数として渡すにはどうすればよいですか?

ベストアンサー1

Java 8以上

Java 8以降のラムダ式を使用すると、抽象メソッドを1つだけ持つクラスまたはインターフェース(SAMタイプ)、 例えば:

public interface MyInterface {
    String doSomething(int param1, String param2);
}

MyInterface が使用されている場所であればどこでも、ラムダ式を置き換えることができます。

class MyClass {
    public MyInterface myInterface = (p1, p2) -> { return p2 + p1; };
}

たとえば、新しいスレッドを非常にすばやく作成できます。

new Thread(() -> someMethod()).start();

そして、メソッド参照構文さらにわかりやすくするために:

new Thread(this::someMethod).start();

ラムダ式がない場合、最後の 2 つの例は次のようになります。

new Thread(new Runnable() { someMethod(); }).start();

Java 8以前

一般的なパターンとしては、たとえば のようにインターフェース内に「ラップ」しCallable、次に Callable を渡すというものがあります。

public T myMethod(Callable<T> func) {
    return func.call();
}

このパターンは、コマンドパターン

特定の用途に合わせてインターフェースを作成するのが最善であることに留意してください。呼び出し可能を選択する場合は、上記の T を、String などの期待する戻り値の型に置き換えます。

以下のコメントに対して次のように答えることができます。

public int methodToPass() { 
        // do something
}

public void dansMethod(int i, Callable<Integer> myFunc) {
       // do something
}

次に、匿名内部クラスを使用して呼び出します。

dansMethod(100, new Callable<Integer>() {
   public Integer call() {
        return methodToPass();
   }
});

これは「トリック」ではないことに注意してください。これは、関数ポインターに相当する Java の基本的な概念にすぎません。

おすすめ記事