【发布时间】:2019-01-11 02:07:42
【问题描述】:
有一个 Optional 的可选列表:
Optional<List<Optional<String>>> optionalList = Optional.of(
Arrays.asList(
Optional.empty(),
Optional.of("ONE"),
Optional.of("TWO")));
如何遍历optionalList打印出字符串的ONE和TWO?
如果有一个可选的可选流呢?
Optional<Stream<Optional<String>>> optionalStream = Optional.of(
Stream.of(
Optional.empty(),
Optional.of("ONE"),
Optional.of("TWO")));
更新:感谢您的回答, optionalStream 的解决方案(非嵌套):
optionalStream
.orElseGet(Stream::empty)
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);
【问题讨论】:
-
到目前为止你有什么尝试?
-
您也可以只将
Optional映射到Stream,而不是检查isPresent并自己明确获取值。会更“实用风格”。 -
您应该避免将
Optional存储在集合中,请参阅Uses for Optional 和Is it Worth it to Use 'Optional' in Collections? -
@DidierL true,但是对于
Stream<Optional<T>>的情况,这仍然是一个有效的练习,当您的集合中的项目通过其他一些函数映射到Optional<T>时,这种练习更为常见,所以你最终得到一个Stream<Optional<T>>,然后你想要过滤并转换为Stream<T>。 -
确实,对我来说这也是一个有效的案例。请注意,Java 9 中引入了 Optional.stream() 方法来避免这种情况(与
flatMap()结合使用)。最后,我也会避免使用Optional<List>和Optional<Stream>,因为它们不太友好。尽可能使用空列表/流,因为这会使 API 更加简洁。
标签: java lambda java-8 java-stream optional