假设我有一个生成器,它会将一些分解成块的结果返回给我,我想把它放到一个平面列表中:
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)
几乎可以工作,但它丢弃了最后一个块。
似乎我在这里需要一个.takeUntil
:就像takeWhile
一样,但是在终止之前要经过整个链。我如何惯用这个?
答案 0 :(得分:0)
这就是我想出来的......看起来有点难过,但这是我能想到的最好的:
Stream.iterate(generator.first) {
case chunk if chunk.hasNext => generator.next
case _ => null
}.takeWhile(_ != null)
.flatMap(_.items)
有更好的想法吗?