首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成给定的Enumerator[T]枚举数[Future[T]]

如何生成给定的Enumerator[T]枚举数[Future[T]]
EN

Stack Overflow用户
提问于 2014-01-05 08:28:46
回答 1查看 545关注 0票数 6

我正试着在2.2.x游戏中把我的头转到Iteratee图书馆。我正在编写一个函数,它生成一个计算成本很高的数据流。这是一个基本的想法,用正方形代替计算部分的代价高昂的部分:

代码语言:javascript
复制
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]是可取的,对吗?如果是的话,有什么惯用的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-05 08:55:17

您可以这样将Enumerator[Future[Int]]转换为Enumerator[Int]

代码语言:javascript
复制
val enumF = Enumerator((1 to 10).map{Future(_)}:_*) // Enumerator[Future[Int]]

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

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

代码语言:javascript
复制
def expensiveRange(start: Int, end: Int): Enumerator[Int] = {
  Enumerator.enumerate(start to end) &> Enumeratee.mapM(expensiveFunction)
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20931578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档