有大量针对
Stream
的应用,其中许多人可能希望对流完全排空的情况进行特殊处理。例如,查询结果集可以表示为一个流,然后呈现到表中,但如果流为空,我可能只想显示一条消息“未找到结果”。
我正在寻找一种将
Stream
转换为 Optional<Stream>
的方法,这样如果存在值,则保证它是非空的(即将产生至少一个元素)。
当然,我可以将
Stream
收集到 Collection
中,测试它是否为空,然后重新流式传输。但这显然不是最佳解决方案。
我利用了Kotlin的扩展功能,给
nonEmpty
添加了一个Stream
方法:
fun <T> Stream<T>.nonEmpty(): Optional<Stream<T>> {
var nonEmptyStream: Stream<T>? = null
val spliterator = this.spliterator()
spliterator.tryAdvance {
nonEmptyStream = Stream.concat(Stream.of(it), StreamSupport.stream(spliterator, this.isParallel))
}
return Optional.ofNullable(nonEmptyStream)
}
这个想法是将流转换为
Spliterator
并尝试从中获取元素。如果成功,我将通过将元素添加到流的其余部分来重建原始流。在我看来,这也应该适用于并行流,但我可能会忽略一些东西(未经测试)。