我正在像这样使用lambda:
TwoValueCommand addition = (a, b) -> a + b;
return pushTwoValueCommand(addition);
有没有办法这样写:
return pushTwoValueCommand(TwoValueCommand (a, b) -> a + b);
无需创建变量?
编辑
这些问题的答案:
How to initialize field using lambda
Assign result of Java lambda to field
为我指明了正确的方向,但是无论如何,他们的用词差异都很大。
答案 0 :(得分:5)
根据How to initialize field using lambda,我确定可以做到这一点:
return pushTwoValueCommand((TwoValueCommand) (a, b) -> a + b); // put parentheses around type to cast lambda expression
从@ernest_k看,我也可以这样做:
return pushTwoValueCommand((a, b) -> a + b);
(尽管我不了解该版本的工作原理-不必使用功能性的接口吗?https://medium.freecodecamp.org/learn-these-4-things-and-working-with-lambda-expressions-b0ab36e0fffc)
编辑
@AndrewTobilko的答案很好地解释了为什么可以执行此操作(无需强制转换)。可以从pushTwoValueCommand的方法定义中推断类型,只要不使pushTwoValueCommand重载(pushTwoValueCommand的多个定义),编译器就无法确定要使用哪个函数接口。
答案 1 :(得分:2)
问题在于没有上下文的(a, b) -> a + b
模棱两可。可以是BinaryOperator<Integer>
,BiFunction<Integer, Integer, Integer>
,TwoValueCommand
。它也可以表示定义了C method(A, B)
之类方法的任何其他功能接口。
如果pushTwoValueCommand
重载了相互冲突的功能接口,则会遇到上述模棱两可的问题。
如果pushTwoValueCommand
有一个版本,则可以直接传递(a, b) -> a + b
,就可以了。
答案 2 :(得分:1)
另一种方法是使pushTwoValueCommand
方法能够接受功能接口。
对于此特定用例,BiFunction
(documentation)是理想的。您的代码可以改写为
<T> T pushTwoValueCommand(
final BiFunction<T, T, T> function,
final T right,
final T left) {
// Do something else, and then
return function.apply(right, left);
}
并用作
return pushTwoValueCommand((a, b) -> a + b, 1, 3);