在Java8中,方法可以创建为Lambda表达式,并且可以通过引用传递(只需做一点工作).网上有很多创建lambda并与方法一起使用的示例,但没有关于如何使用lambda作为参数创建方法的示例.它的语法是什么?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
在Java8中,方法可以创建为Lambda表达式,并且可以通过引用传递(只需做一点工作).网上有很多创建lambda并与方法一起使用的示例,但没有关于如何使用lambda作为参数创建方法的示例.它的语法是什么?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
lambda纯粹是一个调用站点构造:lambda的接收者不需要知道涉及到lambda,而是接受具有适当方法的接口.
换句话说,您定义或使用一个函数接口(即具有单个方法的接口),该接口完全接受并返回您想要的内容.
为此,Java8在java.util.function
中提供了一组常用的接口类型(感谢Maurice Naftalin对JavaDoc的提示).
对于这个特定的用例,有java.util.function.IntBinaryOperator
乘以a single int applyAsInt(int left, int right)
method,所以您可以这样写您的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);
}
然后使用lambda作为参数调用该方法:
public static void main(String[] args) {
TwoArgIntOperator addTwoInts = (a, b) -> a + b;
int result = method(addTwoInts);
System.out.println("Result: " + result);
}
使用自己的界面有一个好处,那就是你可以有更清楚地表明意图的名称.