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 の基本的な概念にすぎません。