java - 如何在 Java 8 中定义一个将 lambda 作为参数的方法?

标签 java lambda java-8

在 Java 8 中,可以将方法创建为 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,而是接受具有适当方法的接口(interface)。

换句话说,您定义或使用一个函数式接口(interface)(即具有单个方法的接口(interface)),它可以准确地接受并返回您想要的内容。

从 Java 8 开始,java.util.function 中有一组常用的接口(interface)类型。 .

对于这个特定的用例,有 java.util.function.IntBinaryOperatora 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 8 中定义一个将 lambda 作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604703/

相关文章:

java - 使用时异常? : operator in Java 8 lambda expression

c++ - 无法正确调用 `connect`

java - 在基于maven配置文件的spring-boot项目中跳过maven shade插件

lambda - 可以将以下 java 代码转换为 Lambda 表达式吗?

Java:合并两个 com.google.common.collect.Table

java - 具有相同标识符值的不同对象已与 session :. 关联,合并和 saveOrUpdate 均不起作用

java - 有没有办法在 Visual Studio 2015 上进行 Java 编程

java - 从Android中的服务获取Activity.Class

java - JodaTime:如何从 LocalTime 获取格式为 "HH:mm Z"的字符串表示形式

recursion - 如何理解clojure的lazy-seq