如何从Optional<Stream>提取Stream?空时返回空Stream
把Optional<Stream>转换为Stream的简洁方法
一步到位的最优实现
直接使用Optional.orElseGet()方法就能满足需求,比你当前的尝试更简洁高效:
Stream<Integer> stream = optionalStream.orElseGet(Stream::empty);
- 当
optionalStream不为空时,直接返回内部封装的Stream<Integer> - 当
optionalStream为空时,返回一个空的Stream
对你现有代码的分析
你当前的代码optionalStream.stream().flatMap(Function.identity())确实能得到正确结果,但逻辑上绕了一圈:
optionalStream.stream()会将Optional转换成一个最多包含1个元素的Stream<Stream<Integer>>flatMap(Function.identity())对这个流做扁平化处理,最终得到目标Stream<Integer>
这种写法功能没问题,但不如orElseGet直接直观。
实际场景的链式调用优化
针对你提到的实际场景——通过stream.findFirst().map(e -> e.getChildren())得到Optional<Stream<Foo>>,可以直接链式调用orElseGet完成转换:
Stream<Foo> childStream = stream.findFirst() .map(YourClass::getChildren) // 可用方法引用简化代码 .orElseGet(Stream::empty);
内容的提问来源于stack exchange,提问作者Dario Viva
相关产品推荐
相关产品推荐

