可选整数列表列表中的 Java 的 flatMap

标签 java java-8 java-stream option-type

我有以下一些无法编译的简化代码,我不明白为什么:

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/

相关文章:

java - 从java中的sql文件将模式加载到h2中

java - 通过按给定百分比增加来传递和更新分数数组

java - 使用 isPresent 方法在 Java8 中列出过滤器

Java lambda流合并模型中的参数

java - 如何使用 java Stream API 查找中值

hashmap - 如何在使用 java 8 流时将映射键转换为大写?

java - 从 Waffle/Pico 转换为 Struts2/Guice

java - 无法使用 Nashorn 在 Java List 上调用 hasOwnProperty

java - 使用 Java 8 流和谓词的此代码的时间复杂度

java - 网络逻辑10.0+jdk 1.5