gpt4 book ai didi

scala - 在给定Enumerator [Future [T]]的情况下,如何产生Enumerator [T]

转载 作者:行者123 更新时间:2023-12-04 13:32:25 25 4
gpt4 key购买 nike

我正在尝试在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 ,而不是创建另一层 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)
}

关于scala - 在给定Enumerator [Future [T]]的情况下,如何产生Enumerator [T],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com