【发布时间】:2018-12-14 09:06:08
【问题描述】:
我有以下一些无法编译的简化代码,我不明白为什么:
List<Optional<Integer>> list =
new ArrayList<>();
List<Integer> flattened =
list
.stream()
.flatMap(i -> i)
.collect(Collectors.toList());
编译器告诉我:
[ERROR] ... incompatible types: cannot infer type-variable(s) R
[ERROR] (argument mismatch; bad return type in lambda expression
[ERROR] Optional<Integer> cannot be converted to Stream<? extends R>)
[ERROR] where R,T are type-variables:
[ERROR] R extends Object declared in method <R>flatMap(Function<? super T,? extends Stream<? extends R>>)
[ERROR] T extends Object declared in interface Stream
我承认我不习惯 Java,但我必须为一个项目。我在 Scala 中模拟了这一点,其中 list.flatten 和等效的 list.flatMap(i => i) 按预期工作:
val list = List(Some(1), Some(2), None)
list.flatten // List(1, 2)
Java 的flatMap 有什么不同吗?
【问题讨论】:
-
这取决于你使用的java版本,见this post
-
您不能“平面映射”单个对象或单个集合。 Flatmap 将流组合成一个流。反过来,这些流可以来自在每个元素上使用
.stream()的集合,如下所示:.flatMap(i -> i.stream())
标签: java java-8 java-stream optional