在 Stream#flatMap(Function<T,Stream<R>>) 中使用 java.util.Function#identity 时出现编译时错误
Compiletime error while using java.util.Function#identity in Stream#flatMap(Function<T,Stream<R>>)
圣诞快乐,
当一些不正常的行为引起我的注意时,我正在修补一些 java.util.Streams。
我只是想压扁一个包含多个整数值流的列表,就像这个例子:
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 );
这个最小的代码片段可以正常工作。
通常当我看到像 s -> s
这样的 lambda 表达式时,我想我可以简单地用 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。
也许这就是您想要的。类型应该是 Stream<Integer>
List<Stream<Integer>> list = new ArrayList<>();
list.add(Stream.of( 1,2 ));
list.add(Stream.of( 3,4 ));
list.stream().flatMap( s -> s ).forEach( System.out::println );
打印
1
2
3
4
圣诞快乐,
当一些不正常的行为引起我的注意时,我正在修补一些 java.util.Streams。 我只是想压扁一个包含多个整数值流的列表,就像这个例子:
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 );
这个最小的代码片段可以正常工作。
通常当我看到像 s -> s
这样的 lambda 表达式时,我想我可以简单地用 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。
也许这就是您想要的。类型应该是 Stream<Integer>
List<Stream<Integer>> list = new ArrayList<>();
list.add(Stream.of( 1,2 ));
list.add(Stream.of( 3,4 ));
list.stream().flatMap( s -> s ).forEach( System.out::println );
打印
1
2
3
4