Java:使用lambda而不将其分配给变量

Java:使用lambda而不将其分配给变量,java,lambda,Java,Lambda,我使用的是lambda,如下所示: TwoValueCommand addition = (a, b) -> a + b; return pushTwoValueCommand(addition); 我有没有办法这样写: return pushTwoValueCommand(TwoValueCommand (a, b) -> a + b); 不必创建变量 编辑 这些问题的答案如下: 给我指出了正确的方向,但他们的措辞已经足够不同了,我还是想发布这篇文章。根据我的决定,我可以这

我使用的是lambda,如下所示:

TwoValueCommand addition = (a, b) -> a + b;
return pushTwoValueCommand(addition);
我有没有办法这样写:

return pushTwoValueCommand(TwoValueCommand (a, b) -> a + b);
不必创建变量

编辑

这些问题的答案如下:

给我指出了正确的方向,但他们的措辞已经足够不同了,我还是想发布这篇文章。

根据我的决定,我可以这样做:

return pushTwoValueCommand((TwoValueCommand) (a, b) -> a + b); // put parentheses around type to cast lambda expression
从@ernest_k我看到我也可以做到这一点:

return pushTwoValueCommand((a, b) -> a + b);
(虽然我不明白该版本是如何工作的,但我不需要使用功能接口吗??)

编辑

@AndrewTobilko的回答很好地解释了为什么你可以这样做(没有演员)。可以从pushTwoValueCommand的方法定义中推断类型,只要pushTwoValueCommand没有重载(pushTwoValueCommand的多个定义),以致编译器无法确定要使用哪个函数接口。

问题在于没有上下文的
(a,b)->a+b
是不明确的。它可以是一个
BinaryOperator
BiFunction
twowalueCommand
。它还可以表示定义方法的任何其他函数接口,如
C方法(a,B)

如果您的
pushTwoValueCommand
重载了相互冲突的功能接口,那么您将遇到上述不明确的问题


如果有一个版本的
pushTwoValueCommand
,您可以直接传入
(a,b)->a+b
,这样您就可以了。

另一种方法是启用
pushTwoValueCommand
方法来接受功能接口。
对于这个特定的用例,
双功能是理想的。您的代码可以重写为

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

您是否在编写
返回pushTwoValueCommand((a,b)->a+b)
时遇到问题?为我指明了正确的方向。。。对不起,但你不是在问新问题。你基本上是说,这是一个重复的问题,有点不同的措辞。你可以做同样的事情,但我仍然认为它也可以,然后关闭作为DUP。@ GooCAT足够公平,我认识到这一事实,这是一个复制品时,我做了原来的职位,但措辞是不同的,我觉得这将是有益的张贴。谷歌搜索并没有很快为我指明正确的方向。我很高兴这个问题与其他答案联系在一起(这就是我发布它们的原因),但“复制”这个词很容易让人误解。关于重复的注意事项:但是,在@ernest_k的建议下,我在没有类型转换的情况下尝试了它,但它仍然有效,因为他认为您有一个模糊问题(这可能是一个原因)。实际上,当您传递像这样的lambda时,您只是省略了任何接口规范,除非您绝对需要这样做。由于安德鲁的所作所为suggesting@edmqkk不足为奇
(a,b)->a+b
是需要在方法中传递的类型的有效实例哇,这很有趣-如果我重载了pushTwoValueCommand方法,我只需要指定类型?令人惊讶的是,在Java中,感觉就像其他地方一样,你必须如此明确,但在这个场景中,你得到了一点类型推断?奇怪的是,java甚至没有自动关键字或从定义中进行类型推断。@edmqkk实际上,java做了很多类型推断(只要可能和明智)。通常,我们只是没有意识到这一点,并将其视为理所当然。如果您让该方法接受实际类型的函数接口(就像我在回答中所做的那样),您会很好。很有趣。在我花了更多的时间学习Java之后,我必须回到这一点上。谢谢@edmqkk使用这种方法,编译器还将阻止您使用不兼容的数据类型,因为您在任何地方都使用“T”类型。
return pushTwoValueCommand((a, b) -> a + b, 1, 3);