scala - 直到?处理分块输入。如何?

标签 scala collections stream

假设我有一个生成器,它返回一些分成 block 的结果,我想将其放入一个平面列表中:

 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)

几乎可以工作,但它会丢弃最后一个 block 。

看起来我在这里需要一个 .takeUntil :像 takeWhile 一样,但在终止之前遍历整个链。我该如何惯用地做到这一点?

最佳答案

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

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

还有更好的想法吗?

关于scala - 直到?处理分块输入。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41370889/

相关文章:

scala - 为什么 ScheduleOnce 每次在应用程序关闭时都会运行?

language-agnostic - 一个 REPL 将它们全部绑定(bind)?

c# - Collection<String> 和 StringCollection 之间的区别

java - 如何选择 Collectors.toList() 返回的列表类型?

java - 如何正确解析Java中的字节流

scala - 为什么 Scala 2.8+ 中没有 'break with value'?

scala - 监督策略可以处理 ConnectException 吗?

c# - 用另一个哈希表更新哈希表?

c# - 在 C# 中序列化、压缩和加密

java - 每次更改变量时如何生成事件流?