具有不可比较参数的Java 8 Lambda转换
这在1.8.0_45.jdk上成功运行。Container#add如何转换为ObjIntConsumer#accept?方法具有不可比较参数的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
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);