1. ホーム
  2. java

[解決済み] Java 8でラムダをパラメータとして受け取るメソッドを定義するにはどうすればよいですか?

2022-03-24 07:12:43

質問

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

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


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

解決方法は?

ラムダの受け手は、ラムダが関与していることを知る必要はなく、代わりに適切なメソッドを持つインターフェイスを受け取ります。

言い換えれば、あなたが望むものを正確に受け入れて返す機能的なインターフェース(つまり、単一のメソッドを持つインターフェース)を定義するか使用します。

このため、Java 8 には、よく使われるインターフェイス型のセットが java.util.function (おかげさまで モーリス・ナフタリン のヒントは、JavaDocについてです。)

この具体的な使用例としては 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);
}

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