我有以下一些无法编译的简化代码,我不明白为什么:
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 中 mock 了这一点,其中 list.flatten
和等效的 list.flatMap(i => i)
工作正常:
val list = List(Some(1), Some(2), None)
list.flatten // List(1, 2)
Java 的 flatMap
有什么不同吗?
最佳答案
应该是:
List<Integer> flattened =
list
.stream()
.filter (Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
您的 flatMap
需要一个将 Stream
元素转换为 Stream
的函数。您应该改用 map
(以提取 Optional
的值)。此外,您需要过滤掉空的 Optional
(除非您希望将它们转换为 null
)。
没有过滤:
List<Integer> flattened =
list
.stream()
.map(o -> o.orElse(null))
.collect(Collectors.toList());
关于可选整数列表列表中的 Java 的 flatMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776473/