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

使用自己的界面有一个好处,那就是你可以有更清楚地表明意图的名称.

Java相关问答推荐

计算战舰沉船/船只的问题(Java)

try Dockerize Maven应用程序,但发布版本21不支持"

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

Java Stream,需要更新列表对象列表

如何以干净的方式访问深度嵌套的对象S属性?

Java中如何根据Font.canDisplay方法对字符串进行分段

解释左移在Java中的工作原理

如何在Spring Java中从数据库列中获取JSON中的具体数据

无法在Java中处理PayPal支付响应

使用多个RemoteDatabase对象的一个线程

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

Java构造函数分支

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

Java17支持哪个MapR版本?

来自外部模块的方面(对于Java+Gradle项目)不起作用

将ByteBuffer异步写入InputStream或Channel或类似对象

无法播放音频:从资源加载库GStreamer-Lite失败

错误:不兼容的类型:Double不能转换为Float

如何根据配置动态创建N个bean

如何在SWT菜单项文本中保留@字符