我正在尝试使用 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/