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);
}
}
ラムダは純粋にコールサイトの構成要素であり、ラムダの受信者はラムダが関与していることを知る必要はなく、代わりに適切なメソッドを持つインターフェイスを受け取ります。
言い換えれば、機能的なインターフェイス(単一のメソッドを持つインターフェイス)を定義または使用することで、必要なものを正確に受け入れて返すことができます。
このために、Java 8ではjava.util.function
によく使われるインターフェイスの型のセットが用意されています(JavaDocに関するヒントをくれたMaurice Naftalinに感謝します)。
この特定のユースケースのために、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);
}
独自のインターフェースを使用することで、より明確に意図を示す名前を付けられるという利点があります。
ラムダ式を使用するには、独自の関数インターフェイスを作成するか、2つの整数を必要とし、値として返す操作のためのJava関数インターフェイスを使用する必要があります。[IntBinaryOperator][1]を参照してください。
ユーザー定義の関数型インターフェースを使用する。
interface TwoArgInterface {
public int operation(int a, int b);
}
public class MyClass {
public static void main(String javalatte[]) {
// this is lambda expression
TwoArgInterface plusOperation = (a, b) -> a + b;
System.out.println("Sum of 10,34 : " + plusOperation.operation(10, 34));
}
}
Javaの関数型インターフェースを使用する {{15904673}}
import java.util.function.IntBinaryOperator;
public class MyClass1 {
static void main(String javalatte[]) {
// this is lambda expression
IntBinaryOperator plusOperation = (a, b) -> a + b;
System.out.println("Sum of 10,34 : " + plusOperation.applyAsInt(10, 34));
}
}
私が作成した他の例はここです。
[1]: https://docs.oracle.com/javase/8/docs/api/java/util/function/IntBinaryOperator.html
http://lambdafaq.org/lambda-resources からリンクされているLambda対応のJava 8 JavaDocsのWebアクセス可能な公開版があります。 (これは明らかにJoachim Sauer氏の回答に対するコメントであるべきですが、コメントを追加するために必要な評価ポイントを持つ私のSOアカウントに入ることができません)。 lambdafaqサイト(私が管理しています)では、これと他の多くのJava-lambdaの質問に答えています。
NB この回答は、Java 8 GAのドキュメントが一般に利用可能になる前に書かれたものです。しかし、Lambda FAQは、Java 8で導入された機能について学ぶ人々にとってまだ有用かもしれないので、そのままにしておきました。