2016-12-28 16 views
5

Giả sử tôi có một máy phát điện, mà trả về cho tôi một số kết quả chia thành khối, mà tôi muốn kéo vào một danh sách phẳng:takeUntil? Đang xử lý dữ liệu đầu vào được chunked. Làm sao?

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 
} 

Về mặt lý thuyết, đây là những gì tôi muốn, ngoại trừ, rồi nó lấy toàn bộ nội dung trả trước, và tôi muốn nó lười biếng. Một cái gì đó như thế này:

Stream.iterate(generator.first)(generator.next) 
    .takeWhile(_.hasNext) 
    .flatMap(_.items) 

hầu hết hoạt động, nhưng loại bỏ đoạn cuối cùng.

Có vẻ như tôi cần một số .takeUntil tại đây: như takeWhile, nhưng đi qua toàn bộ chuỗi trước khi chấm dứt. Làm thế nào để tôi làm điều này một cách tự nhiên?

+0

Có liên quan? http://stackoverflow.com/questions/33602714/how-to-implement-takeuntil-of-a-list –

+1

@ evan058 không giúp được gì nhiều, bởi vì '.span' vật chất hóa toàn bộ mọi thứ. : / – Dima

Trả lời

0

Đây là những gì tôi đã đưa ra ... Trông kinda yucky nhưng điều này là tốt nhất tôi có thể nghĩ ra:

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

Bất kỳ ý tưởng tốt hơn?

Các vấn đề liên quan