为什么这些Java 8 lambdas在类型转换期间表现不同?

Khu*_*uzi 9 java java-8 java-stream

Stream st = Stream.of(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

这是创建整数流(通过在运行时推断)还是对象流?

st.collect(Collectors.averagingInt((Integer x)->x));
Run Code Online (Sandbox Code Playgroud)

这条线很好.

st.forEach((Integer x)-> System.out.println(x));
Run Code Online (Sandbox Code Playgroud)

这行不编译.它在(整数x)处给出一个编译错误,说出预期的对象但是找到了Integer.为什么?

为什么上面的averagingInt方法没有抱怨相同?

averagingInt将ToIntFunction接口作为原始引用类型,<? super T>并允许Integer值.虽然forEach正在使用与原始引用类型相同的Consumer接口,<? super T>但编译器正在抱怨Integer参数值.

Mak*_*oto 1

签名不同

Collectors.averagingInt接受 a ToIntFunction,其中操作的返回collect类型绑定到 的类型Stream,该类型是原始类型。

Stream.forEach接受 a Consumer,它直接绑定到 的类型Stream

forEach由于类型安全性,原始类型会干扰您指定类型的能力,因此会导致编译错误。

  • 你的回答听起来不清楚,无助于澄清我的疑虑。请用手头的例子简要解释一下。PS:collect操作的返回类型与Collector方法的返回类型绑定,这里是averagingInt方法。我的问题更多是关于 lambda 中的参数类型。 (3认同)