Java函数指针和自动装箱

Java函数指针和自动装箱,java,function,lambda,Java,Function,Lambda,据我所知,Java函数指针或lambda声明签名如下: BiFunction<Integer, Integer, Integer> add = (a,b) -> a+b; 这里是否涉及自动装箱? 如果是,如何避免它(仍然有类似于函数指针的东西) 我知道自动装箱可能是一个性能问题,因为它每次都会创建一个对象(而不是堆栈上的原语)。 如果它是隐式发生的,这可能会令人沮丧,所以我要问。是的。不能将基元类型与泛型一起使用,因此使用包装器类。我认为,这就是为什么会有原始替代品的原因:I

据我所知,Java函数指针或lambda声明签名如下:

BiFunction<Integer, Integer, Integer> add = (a,b) -> a+b;
这里是否涉及自动装箱?
如果是,如何避免它(仍然有类似于函数指针的东西)

我知道自动装箱可能是一个性能问题,因为它每次都会创建一个对象(而不是堆栈上的原语)。
如果它是隐式发生的,这可能会令人沮丧,所以我要问。

是的。不能将基元类型与泛型一起使用,因此使用包装器类。我认为,这就是为什么会有原始替代品的原因:IntFunction,等等

这里涉及自动装箱吗

当然
1
是一个int文本,而不是整数。因此,为了传递给需要整数的对象,编译器会在后台执行必要的操作

正如评论中指出的那样:如果你想避免这种情况,你需要使用。因为这种抽象允许您传递
int

或者,您可以显式地使用
…apply(Integer.valueOf(1),…

函数add=(a,b)->a+b;

您感到困惑;这无法编译。
函数将一个整数引用转换为另一个整数引用;您所编写的将两个引用转换为另一个整数引用。我猜您的意思是:

BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;

当然,您可以使用它们,这就是自动装箱发挥作用的地方聪明到可以做正确的事情,但它会带来性能损失,这取决于使用情况。@GhostCat如何使用SomeObject?是的,我们讨论的是两件不同的事情。OP询问对采用数字或整数的泛型方法使用int参数。这很有效。你是对的,泛型类型本身必须是引用类型。
BiFunction
的签名是
BiFunction
,但在这种情况下,
BinaryOperator
显然更可取。
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
IntBinaryOperator add = (a, b) -> a + b;