2016-12-28 58 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) 

更好的想法?

相關問題