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

bra*_*orm 4 lambda java-8 functional-interface

这是我试过的.它甚至没有编译.

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

}
Run Code Online (Sandbox Code Playgroud)

我想在这里努力实现的一些事情是:

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

2)如何将参数传递给函数(在 handleOpertion方法中,存在compilation应用的错误只需要一个参数)

Ale*_* C. 5

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

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

通过提供一个尊重BinaryOperator<Integer>接口契约的lambda表达式,即一个将两个Integer作为参数并返回一个的方法Integer.

handleOperation(10,10, (a, b) -> a + b)
Run Code Online (Sandbox Code Playgroud)

2)如何将参数传递给函数(在handleOpertion方法中,存在应用的编译错误只需要一个参数)

因为函数具有形式,f => u因此apply方法采用单个参数并产生单个结果,如数学函数,如f(x) = 2 * x(参考答案的第一部分).

这是我试过的.它甚至没有编译.

要编译代码,可以在使用方法引用之前使方法静态或创建新实例.然后它会addhandleOperation调用函数的apply方法时引用新实例的方法.

handleOperation(10,10, new Operation()::add);
Run Code Online (Sandbox Code Playgroud)

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