如何在 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);
这是我试过的。它甚至无法编译。
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);