如何在 Java 8 中传递带参数的 lambda 表达式作为参数?

how to pass lambda expression with arguments as parameters in Java 8?

这是我试过的。它甚至无法编译。

public class LambdaExample {

    public static Integer handleOperation(Integer x, Integer y,  Function converter){
                return converter.apply(x,y);
    }

    public static void main(String[] args){
         handleOperation(10,10, Operation::add);
    }

}

class Operation {

    public int add(Integer x, Integer y){
        return x+y;
    }

}

我正在尝试 acheive/learn 的几件事是:

1) 如何将 lambda expression 作为方法参数传递(在上面的 main 方法中)

2) 如何给函数传递参数(在handleOpertion方法中,有compilation错误,apply只接受一个参数)

您的 handleOperation 方法采用实现 Function 的对象,Operation::add(方法引用)不符合条件。此外,对于两个参数,您需要改用 BiFunction

这是一个应该有效的示例:

public class LambdaExample {

    public static Integer handleOperation(Integer x, Integer y,  BiFunction<Integer, Integer, Integer> converter){
                return converter.apply(x,y);
    }

    public static void main(String[] args){
         handleOperation( 10,10, new Operation() ); // should return 20
    }

}

class Operation implements BiFunction<Integer, Integer, Integer> {

    public Integer apply(Integer x, Integer y){
        return x+y;
    }

}

已更新:

public class LambdaExample {

    public static Integer handleOperation(Integer x, Integer y,  BiFunction<Integer, Integer, Integer> converter){
                return converter.apply(x,y);
    }

    public static void main(String[] args){
         handleOperation( 10,10, Operation::add ); // should return 20
    }

}

class Operation {

    public static int add(Integer x, Integer y){
        return x+y;
    }

}

A Function 接受输入 x 并产生结果 y。因此,在执行 return converter.apply(x,y); 时,您不是在寻找 Function(更不用说您使用了原始类型),而是在寻找 BiFunction<Integer, Integer, Integer> 或更简单的 BinaryOperator<Integer>,因为每个类型参数相同。

1) how to pass lambda expression as method parameter ( in main method above)

通过提供遵守 BinaryOperator<Integer> 接口约定的 lambda 表达式,即采用两个 Integer 作为参数和 return 一个 Integer 的方法。

handleOperation(10,10, (a, b) -> a + b)

2) how to pass parameters to the function (in handleOpertion method, there is compilation error that apply takes only one parameter)

因为函数的形式是 f => u 因此 apply 方法采用单个参数并产生单个结果,就像 f(x) = 2 * x 这样的数学函数(请参阅回答)。

Here is what I tried. and it does not even compile.

要使您的代码通过编译,您可以将方法设为静态,或者在使用方法引用之前创建一个新实例。然后在handleOperation调用函数的apply方法时,会引用新实例的add方法。

handleOperation(10,10, new Operation()::add);

请注意,此方法已存在于 JDK 中,它是 Integer::sum。它采用两个原始 int 值而不是 Integer 引用,但它足够接近,因此自动装箱机制将使该方法有效地在方法上下文中显示为 BinaryOperator<Integer>

您的函数参数是原始的(未类型化的)并且应该是一个 BiFunction。

试试这个:

public static Integer handleOperation(Integer x, Integer y,  BiFunction<Integer, Integer, Integer> converter){
    return converter.apply(x,y);
}

所有 3 种类型都相同的 BiFunction 可以用(单一类型的)BinaryOperator 替换:

public static Integer handleOperation(Integer x, Integer y,  BinaryOperator<Integer> converter){
    return converter.apply(x,y);
}

要调用它,您可以这样做:

int sum = handleOperation(1, 2, (x, y) -> x + y); // 3

实际上,您已经实施了减少。这个调用同样可以写成:

int sum = Stream.of(1, 2).reduce((x, y) -> x + y);