具有不可比较参数的Java 8 Lambda转换

具有不可比较参数的Java 8 Lambda转换,lambda,java-8,functional-interface,Lambda,Java 8,Functional Interface,这在1.8.0_45.jdk上成功运行。Container#add如何转换为ObjIntConsumer#accept?方法Container.add是一种实例方法,需要在其上调用实例。由于表单ClassName::methodName上的方法引用未绑定到实例,Container::add的函数签名为(Container,T) 由于没有为Container指定类型参数,也没有指定目标类型,编译器将推断Container。因此,Container::add在这里有推断的签名(Container,O

这在1.8.0_45.jdk上成功运行。Container#add如何转换为ObjIntConsumer#accept?

方法
Container.add
是一种实例方法,需要在其上调用实例。由于表单
ClassName::methodName
上的方法引用未绑定到实例,
Container::add
的函数签名为
(Container,T)

由于没有为
Container
指定类型参数,也没有指定目标类型,编译器将推断
Container
。因此,
Container::add
在这里有推断的签名
(Container,Object)
,这适用于
ObjIntConsumer
accept
方法,该方法有签名
(Container,int)

第二个参数可以接受类型为
int
的值,因为在将其装箱为
Integer
后,它可以分配给
对象

如果将结果分配给变量,从而提供一个目标类型,即
Container
Container
等,则同样适用

this is container 2
this is container 3
this is container 1
收集的容器
=IntStream.of(2,3,1).collect(容器::new,容器::add,null);
任何可以使用
整数
的类型参数,例如
可序列化
数字
,也可以使用


您可以在中阅读有关实例方法的无限引用的更多信息



作为旁注,流的
collect
方法不应该接受
null
参数,
Stream
实现不接受参数。传递
null
与基本流一起工作是当前实现中的一个小故障,传递
null
的代码可能在下一个版本中中断。因为,该行为已经处于Java 9的当前开发状态。

顺便说一句,我很惊讶
IntStream
接受
null
作为
collect
的最后一个参数。标准的
Stream
实现没有。它在JDK-9中,因此我不会这样写。我的困惑不是装箱、拆箱。我为方法提供了一个参数“add(tt)”,但它被转换为两个参数accept(tt,int-value)。我希望这样:required:java.lang.Integer found:java.lang.Integer,int原因:实际参数列表和形式参数列表的长度不同
容器。add
方法不是
静态的
。因此,它需要一个
容器
实例来调用它,再加上一个
T
实例作为参数传递。对
(容器,T)
进行功能签名。看见
this is container 2
this is container 3
this is container 1
Container<Integer> collected
   = IntStream.of(2, 3, 1).collect(Container::new, Container::add, null);