这是我尝试过的。它甚至没有编译。
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
错误只需要一个参数)
答案 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);