Java 8 flatMap + Optional.of 不编译

标签 java functional-programming java-8 option-type flatmap

我正在尝试使用 Java flatMap Optional。这是一个简化的示例:

List<String> x = Arrays.asList("a", "b", "c");
List<String> result = x.stream().flatMap((val) -> val.equals("b") ? Optional.empty() : Optional.of(val)).collect(Collectors.toList());

我从编译器得到这个错误信息:

Error:(10, 27) java: incompatible types: no instance(s) of type variable(s) T exist so that java.util.Optional<T> conforms to java.util.stream.Stream<? extends R>

怎么了?这是我试图在 Scala 中实现的示例:

List("a", "b", "c").flatMap(x => if (x == "b") None else Some(x))

它返回:

res2: List[String] = List(a, c)

如预期。

如何将其转换为 Java 以便编译?

最佳答案

flatMap预计映射输入的元素 Stream进入不同的Stream .因此它必须返回 Stream而不是 Optional .

因此,你应该这样做:

List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result = 
    x.stream()
     .flatMap((val) -> 
                  val.equals("b") ? Stream.of(Optional.empty()) : 
                                    Stream.of(Optional.of(val)))
     .collect(Collectors.toList());

请注意,如果您的目标只是摆脱某些值(在您的示例中为“b”),则根本不需要使用 Optional。您可以只过滤流:

List<String> result = 
    x.stream()
     .filter (val -> !val.equals("b"))
     .collect(Collectors.toList());

这样你就不需要flatMap你的输出是 List<String>而不是 List<Optional<String>> .

正如 Holger 所说,返回 Stream 的解决方案的 Optional可以使用 map 简化 s而不是 flatMap ,因为每个元素都映射到一个 Optional :

List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result = 
    x.stream()
     .map((val) -> val.equals("b") ? Optional.empty() : Optional.of(val))
     .collect(Collectors.toList());

关于Java 8 flatMap + Optional.of 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26611873/

相关文章:

javascript - 使用 ramda.js 将对象数组转换为一个对象

java - 根据条件拆分对象集合

java - 使用 Java 8 5 天编译用 Java 编写的旧程序

java - 代码的正则表达式

java - 使用方法参数查找数组最小值的优雅方法?

java - Play Framework - 值登录不是 controllers.Application 的成员

haskell - 让 putStrLn 在 if-else block 内工作

java - 使用 Byte Buddy 重新转换类

javascript - javascript 中 throttle 的函数式编程等价物是什么?

java - 使用 Lambda 解引用 Int 值