Java 8でラムダをパラメータとして受け取るメソッドを定義するにはどうすればいいですか? 質問する

Java 8でラムダをパラメータとして受け取るメソッドを定義するにはどうすればいいですか? 質問する

Java 8 では、メソッドをラムダ式として作成し、参照渡しすることができます (裏で少し作業が必要です)。ラムダを作成してメソッドで使用する例はオンラインでたくさんありますが、ラムダをパラメータとして受け取るメソッドを作成する方法の例はありません。その構文は何ですか?

MyClass.method((a, b) -> a + b);
    

class MyClass{
  //How do I define this method?
  static int method(Lambda l) {
    return l(5, 10);
  }
}

ベストアンサー1

ラムダは純粋に呼び出しサイト構造です。ラムダの受信者は、ラムダが関係していることを知る必要はなく、代わりに適切なメソッドを持つインターフェースを受け入れます。

つまり、必要なものを正確に受け入れて返す機能インターフェース (つまり、単一のメソッドを持つインターフェース) を定義または使用します。

Java 8以降では、よく使われるインターフェース型のセットがjava.util.function

この特定のユースケースではjava.util.function.IntBinaryOperator単一のint applyAsInt(int left, int right)方法次のように記述できますmethod

static int method(IntBinaryOperator op){
    return op.applyAsInt(5, 10);
}

ただし、独自のインターフェースを定義して、次のように使用することもできます。

public interface TwoArgIntOperator {
    public int op(int a, int b);
}

//elsewhere:
static int method(TwoArgIntOperator operator) {
    return operator.op(5, 10);
}

次に、ラムダをパラメータとしてメソッドを呼び出します。

public static void main(String[] args) {
    TwoArgIntOperator addTwoInts = (a, b) -> a + b;
    int result = method(addTwoInts);
    System.out.println("Result: " + result);
}

独自のインターフェースを使用すると、意図をより明確に示す名前を付けることができるという利点があります。

おすすめ記事