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