加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:10:00 所属栏目:安全 来源:网络整理
导读:我正试着在Play 2.2.x中找到Iteratee库.我正在编写一个生成数据流的函数,计算成本很高.这是基本的想法,用方块替换昂贵的计算部分: def expensiveFunction(x: Int): Future[Int] = Future.successful(x * x)def expensiveRange(start: Int,end: Int): Enumer
我正试着在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]是正确的吗?如果是这样,这样做的惯用方法是什么?

解决方法

您可以通过以下方式将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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读