我想在一个流前面添加一个Optional。由于Stream.concat
只能连接流,所以我有一个问题:
如何将Optional<T>转换为Stream<T>?
示例:
Optional<String> optional = Optional.of("Hello");
Stream<String> texts = optional.stream(); // not working
我想在一个流前面添加一个Optional。由于Stream.concat
只能连接流,所以我有一个问题:
如何将Optional<T>转换为Stream<T>?
示例:
Optional<String> optional = Optional.of("Hello");
Stream<String> texts = optional.stream(); // not working
Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty);
List<String>
而不是单个的 String
对象,那么你只需要将 Stream::of
替换为 List::stream
。对于任何其他类型的集合也适用。你也可以使用 Collection::stream
。否则你会得到一个 Stream<List<String>>
,这可能 不是 你想要的。 - walenOptional<T>
转换为 Stream<T>
,如果 T 是 List<String>
,那就是它。答案仍然正确。你可能正在寻找的是展平集合。此外,如果你最终使用了 Optional<Collection<T>>
,那么你已经走错了路。 - Naman在Java 9中,新增了缺失的stream()
方法,因此该代码可以工作:
在Java 9中新增了stream()
方法,因此此代码可正常运行:
Stream<String> texts = optional.stream();
请查看JDK-8050820。在此处下载Java-9 。
如果你没有使用Java 9,我可以推荐使用Guava的Streams.stream(optional)
方法。这是一个简单的例子:
Streams.stream(Optional.of("Hello"))
Streams.stream
,这样你只需写stream(Optional.of("Hello"))
您可以做以下操作:
Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
map().orElseGet()
方法不太流畅,但可能稍微更有效率。 - augurar这取决于您希望如何将空可选项转换为流元素。如果您想将其解释为“无内容”(或“无元素”):
Stream<String> texts = optional.stream(); // since JDK 9
Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty); // JDK 8
Stream<String> texts = Stream.of(optional.oreElse(null));
final List<String> flintstones = new ArrayList<String>(){{
add("Fred");
add("Wilma");
add("Pebbles");
}};
final List<String> another = Optional.ofNullable(flintstones)
.map(Stream::of)
.orElseGet(Stream::empty)
.toList();
https://github.com/sourcy/streamify
从可选项创建流到streamify中的表单:Streamify.stream(optional)