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

2022-08-31 04:32:04

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

答案 1

Lambdas 纯粹是一个调用站点构造: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);
}

使用自己的界面的优点是,您可以拥有更清楚地指示意图的名称。


答案 2

要使用 Lambda 表达式,您需要创建自己的函数接口或使用 Java 函数接口进行需要两个整数并作为值返回的操作。IntBinaryOperator

使用用户定义的功能接口

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

    }
}

推荐