scala - 如何对从 Enumerator[A] 到 Enumerator[Seq[A]] 的元素进行分组?

标签 scala playframework-2.0

我有来自 Enumerator[A] 的元素,并且想要对元素进行分组/批处理以获得 Enumerator[Seq[A]] 。这是我编写的代码 ASeq[A] ,但不会产生 Enumerator[Seq[A]] .

val batchSize = 1000
dogsEnumerator
  .run(
    Iteratee.fold1[Dog, Vector[Dog]](Future.successful(Vector[Dog]())){
      (r, c) =>
        if (r.size > batchSize)
          processBatch(r).map(_ => Vector[Dog]())
        else
          Future.successful(r :+ c)
    }.map(_ => ())
  )

最佳答案

这可以在一些 Enumeratee 的帮助下非常简单地完成。组合器:

import play.api.libs.iteratee._

def batch[A](n: Int): Enumeratee[A, List[A]] = Enumeratee.grouped(
  Enumeratee.take(n) &>> Iteratee.getChunks[A]
)

然后我们可以使用这个枚举器将任何枚举器转换为新的列表枚举器:

val intsEnumerator = Enumerator(1 to 40: _*)

intsEnumerator.through(batch(7)).run(Iteratee.foreach(println))

这将打印以下内容:

List(1, 2, 3, 4, 5, 6, 7)
List(8, 9, 10, 11, 12, 13, 14)
List(15, 16, 17, 18, 19, 20, 21)
List(22, 23, 24, 25, 26, 27, 28)
List(29, 30, 31, 32, 33, 34, 35)
List(36, 37, 38, 39, 40)

正如预期的那样。

关于scala - 如何对从 Enumerator[A] 到 Enumerator[Seq[A]] 的元素进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281845/

相关文章:

playframework - play 框架 :what Is the difference between play. api.mvc 和 play.mvc 包

scala - 如何使用 sbt 发布附加工件(one-jar)

scala - 光滑的 3.0 多对多查询,将连接作为可迭代对象

scala - 关于编译期间未处理的类型类的警告

postgresql - 使用 Slick 执行并发查询时出现 NullPointerException

scala - Play/Scala : use Redirect in ActionBuilder

scala - 使用子类 (cats/scalaz) 使用 Functor 调用泛型函数

使用数值泛型进行 Scala 运算

java - 玩!框架 - 无法连接到数据库

java - 使用 Play Framework 时是否可以摆脱 Scala?