空流特殊处理

问题描述 投票:0回答:1

有大量针对

Stream
的应用,其中许多人可能希望对流完全排空的情况进行特殊处理。例如,查询结果集可以表示为一个流,然后呈现到表中,但如果流为空,我可能只想显示一条消息“未找到结果”。

我正在寻找一种将

Stream
转换为
Optional<Stream>
的方法,这样如果存在值,则保证它是非空的(即将产生至少一个元素)。

当然,我可以将

Stream
收集到
Collection
中,测试它是否为空,然后重新流式传输。但这显然不是最佳解决方案。

kotlin java-stream
1个回答
0
投票

我利用了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
并尝试从中获取元素。如果成功,我将通过将元素添加到流的其余部分来重建原始流。在我看来,这也应该适用于并行流,但我可能会忽略一些东西(未经测试)。

© www.soinside.com 2019 - 2024. All rights reserved.