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

时间:2015-05-27 22:34:41

标签: 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;
    }

}

我想在这里尝试实现的一些事情是:

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

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

3 个答案:

答案 0 :(得分:5)

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)
  

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

因为函数的格式为f => u,因此apply方法只接受一个参数并产生单个结果,如f(x) = 2 * x等数学函数(参见答案的第一部分)

  

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

要使代码编译,您可以在使用方法引用之前使方法静态或创建新实例。然后,当add将调用函数的apply方法时,它将引用新实例的handleOperation方法。

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

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

答案 1 :(得分:4)

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

}

答案 2 :(得分:3)

你的Function参数是raw(无类型),应该是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);