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

新手上路,请多包涵

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

原文由 Marius 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

Lambda 纯粹是一个调用站点构造:Lambda 的接收者不需要知道涉及 Lambda,而是接受具有适当方法的接口。

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

自 Java 8 以来,在 java.util.function 中有一组常用的接口类型。

对于这个特定的用例,有一个 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);
}

然后使用 lambda 作为参数调用该方法:

 public static void main(String[] args) {
    TwoArgIntOperator addTwoInts = (a, b) -> a + b;
    int result = method(addTwoInts);
    System.out.println("Result: " + result);
}

使用您自己的界面的好处是您可以使用更清楚地表明意图的名称。

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

要使用 Lambda 表达式,您需要创建自己的功能接口或使用 Java 功能接口进行需要两个整数并作为值返回的操作。 整数二进制运算符

使用用户定义的功能接口

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 函数式接口

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

    }
}

原文由 pardeep131085 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题