假设我有一个生成器,它返回一些分成 block 的结果,我想将其放入一个平面列表中:
def pull(chunk: Chunk, result: Stream[Item] = Stream.empty): Stream[Item] = {
val soFar = chunk.items ++ result
if(chunk.hasNext) pull(generator.next(chunk), soFar) else soFar
}
从概念上讲,这就是我想要的,除了它预先获取整个内容,而且我希望它是惰性的。 像这样的事情:
Stream.iterate(generator.first)(generator.next)
.takeWhile(_.hasNext)
.flatMap(_.items)
几乎可以工作,但它会丢弃最后一个 block 。
看起来我在这里需要一个 .takeUntil
:像 takeWhile
一样,但在终止之前遍历整个链。我该如何惯用地做到这一点?
最佳答案
这就是我想出的......看起来有点恶心,但这是我能想到的最好的:
Stream.iterate(generator.first) {
case chunk if chunk.hasNext => generator.next
case _ => null
}.takeWhile(_ != null)
.flatMap(_.items)
还有更好的想法吗?
关于scala - 直到?处理分块输入。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41370889/