2016-12-28 31 views
5

假设我有一台发电机,它返回我一些成绩分成块,我想拉成一个平坦的列表:takeUntil?处理分块输入。怎么样?

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

相关? http://stackoverflow.com/questions/33602714/how-to-implement-takeuntil-of-a-list –

+1

@ evan058这并没有多大帮助,因为'.span'预先实现了整个事物。 :/ – Dima

回答

0

这是我想出了......看起来有点恶心的,但是这是我能想到的最好的:

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

更好的想法?

相关问题