如何使用枚举器生成枚举器[T] [Future [T]]

时间:2014-01-05 08:28:47

标签: scala playframework

我试图在Play 2.2.x中尝试Iteratee库。我正在编写一个生成数据流的函数,计算成本很高。这是基本的想法,用方块替换昂贵的计算部分:

def expensiveFunction(x: Int): Future[Int] = Future.successful(x * x)

def expensiveRange(start: Int, end: Int): Enumerator[Future[Int]] = {
    Enumerator.enumerate(start to end).map(i => expensiveFunction(i))
}

如果我调用expensiveRange我得到Enumerator[Future[Int]],这不是我想要的,因为它似乎没有利用Iteratee模式的显式异步。似乎我应该能够将其转换为Enumerator[Int],它使用我返回的期货而不是创建另一层Future

我认为将结果转换为Enumerator[Int]是正确的吗?如果是这样,这样做的惯用方法是什么?

1 个答案:

答案 0 :(得分:13)

您可以通过以下方式将Enumerator[Future[Int]]转换为Enumerator[Int]

val enumF = Enumerator((1 to 10).map{Future(_)}:_*) // Enumerator[Future[Int]]

val enum = enumF &> Enumeratee.mapM(identity) // Enumerator[Int]

但是你不需要这种转换,因为正如Travis Brown所指出的,你可以像这样重写你的方法:

def expensiveRange(start: Int, end: Int): Enumerator[Int] = {
  Enumerator.enumerate(start to end) &> Enumeratee.mapM(expensiveFunction)
}