如何将Optional <T>转换为Stream <T>?

sla*_*dan 60 java optional java-8 java-stream

我想在一个带有Optional的前缀中添加一个流.既然Stream.concat只能连接Streams我有这个问题:

如何将Optional <T>转换为Stream <T>?

例:

Optional<String> optional = Optional.of("Hello");
Stream<String> texts = optional.stream(); // not working
Run Code Online (Sandbox Code Playgroud)

sla*_*dan 125

在Java 8中,您可以这样做:

Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty);
Run Code Online (Sandbox Code Playgroud)

  • 我赞成这一点,因为Java 9对于当前状态下的某些项目有一些非向后兼容的更改.某些项目,例如[lombok](https://github.com/rzwitserloot/lombok/issues/985),是核心企业工件的一部分,这些工件很难被更改. (4认同)

Tag*_*eev 67

在Java-9 stream()中添加了缺少的方法,因此该代码有效:

Stream<String> texts = optional.stream();
Run Code Online (Sandbox Code Playgroud)

JDK-8050820.在这里下载Java-9 .


Kon*_*kov 6

你可以做:

Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
Run Code Online (Sandbox Code Playgroud)

  • 我不是'isPresent`的忠实粉丝,这对我来说感觉像是一种遗留方法,让我想起Java8之前的时代.但感谢您提供替代解决方案. (13认同)

Utk*_*mir 6

如果您不在Java 9上,我可以推荐GuavaStreams.stream(optional)方法。一个简单的示例:

Streams.stream(Optional.of("Hello"))
Run Code Online (Sandbox Code Playgroud)

也可以静态导入Streams.stream,因此您可以编写

stream(Optional.of("Hello"))
Run Code Online (Sandbox Code Playgroud)