我有来自Enumerator[A]
的元素,并希望对元素进行分组/批处理以获得Enumerator[Seq[A]]
。我在这里编写的代码将A
分组到Seq[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(_ => ())
)
答案 0 :(得分:4)
在一些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)
正如所料。