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

 乘浪追风2010_210 发布于 2023-02-06 14:49

我正试着在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 个回答
  • 你可以转换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)
    }
    

    2023-02-06 14:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有