Javaでは、関数を別の関数の引数としてどのように渡すことができますか?
単一の抽象メソッド(SAMタイプとも呼ばれる)のみを持つクラスまたはインターフェースがある場合は、Java 8+ラムダ式を使用します。次に例を示します。
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();
一般的なパターンはCallable
、たとえばのようにインターフェース内で「ラップ」することです。その後、Callableを渡します。
public T myMethod(Callable<T> func) {
return func.call();
}
このパターンは、コマンドパターンと呼ばれます。
特定の用途向けのインターフェースを作成するのが最善であることを覚えておいてください。callableを使用することを選択した場合は、上記の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の基本的な概念であり、関数ポインタに相当します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加