将枚举器[T]转换为List [T]

时间:2014-08-11 19:55:40

标签: scala playframework-2.0 reactivemongo

我正在使用ReactiveMongo将应用程序与遗留应用程序集成。

因为,我必须在某些时候维护遗留应用程序接口,我必须阻止和/或将我的代码转换为指定的接口类型。我将该代码简化为下面的示例。

有没有比getChunks更好的方法来使用输出类型为List的所有枚举器?什么是标准做法?

implicit def legacyAdapter[TInput,TResult]
  (block: Future[Enumerator[TInput]])
  (implicit translator : (TInput => TResult), 
            executionContext:ExecutionContext,
            timeOut : Duration): List[TResult] = {

  val iter = Iteratee.getChunks[TResult]
  val exhaustFuture = block.flatMap{
    enumy => { enumy.map(i => translator(i) ).run(iter) }
  }

  val r  = Await.result(exhaustFuture , timeOut)
  r
}

2 个答案:

答案 0 :(得分:2)

Iteratee.getChunks是playframework提供的唯一一个通过消耗枚举器的所有块来构建列表的实用程序,你当然可以使用Iteratee.fold做同样的事情但是你会重新发明轮子,因为Iteratee.getChunks使用了Iteratee。倍。

答案 1 :(得分:0)

我们发现将http://reactivemongo.org/releases/0.10/api/index.html#reactivemongo.api.Cursor的Collect方法暴露得比收集枚举器的块更高效。所以从某种意义上说,我们通过改变问题来解决问题。

这确实意味着我们的数据层的API更改,但允许的性能改进。