takeUntil?处理分块输入。怎么样?

时间:2016-12-28 22:56:52

标签: scala collections stream

假设我有一个生成器,它会将一些分解成块的结果返回给我,我想把它放到一个平面列表中:

 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一样,但是在终止之前要经过整个链。我如何惯用这个?

1 个答案:

答案 0 :(得分:0)

这就是我想出来的......看起来有点难过,但这是我能想到的最好的:

 Stream.iterate(generator.first) {
   case chunk if chunk.hasNext => generator.next
   case _ => null
 }.takeWhile(_ != null)
  .flatMap(_.items)

有更好的想法吗?