圣诞快乐,
我在修改一些java.util.Stream时,一些不规则的行为引起了我的注意。
我只是想把一个包含几个整数值流的列表压平,比如这个例子:
List<Stream> list = new ArrayList<>();
list.add(Stream.of( 1,2 ));
list.add(Stream.of( 3,4 ));
list.stream().flatMap( s -> s ).forEach( System.out::println );
这个最小的代码片段工作起来没有任何问题。
通常当我看到lambda表达式时
s -> s
我想我可以简单地用
java.util.Function#identity()
由于它几乎是一样的,但在这样做的过程中,我遇到了这个编译时问题:
D:\Development\Java\Playground\src\Main.java:15:30
java: incompatible types: cannot infer type-variable(s) R,T
(argument mismatch; java.util.function.Function<java.util.stream.Stream,java.util.stream.Stream> cannot be converted to java.util.function.Function<? super java.util.stream.Stream,? extends java.util.stream.Stream<? extends java.lang.Object>>)
我自己无法完全解释使用之间的区别
java.util.Function#identity()
和
s->s
。那么,为什么会出现这种编译时问题呢?我的猜测是这与类型擦除有关,但我不确定,也无法自己解释。
我使用的是OpenJDK v16.0.1。