1. ホーム
  2. java

[解決済み] Javaで関数をパラメータとして渡すには?[重複]する

2022-02-18 13:31:13

質問

Javaで、ある関数を他の関数の引数として渡すにはどうしたらよいでしょうか?

どのように解決するのですか?

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();
}

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

特定の用途のためにインターフェイスを作成するのが最善であることを心に留めておいてください。もし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の基本概念に過ぎないのです。