gpt4 book ai didi

scala - 如何从 Enumerator/Iteratee 获取结果?

转载 作者:行者123 更新时间:2023-12-02 01:47:36 24 4
gpt4 key购买 nike

我正在使用 play2 和 reactivemongo 从 mongodb 获取结果。结果的每一项都需要进行转换以添加一些元数据。之后我需要对其进行一些排序。

为了处理转换步骤,我使用 enumerate():

def ideasEnumerator = collection.find(query)
.options(QueryOpts(skipN = page))
.sort(Json.obj(sortField -> -1))
.cursor[Idea]
.enumerate()

然后我创建一个 Iteratee 如下:

val processIdeas: Iteratee[Idea, Unit] =
Iteratee.foreach[Idea] { idea =>
resolveCrossLinks(idea) flatMap { idea =>
addMetaInfo(idea.copy(history = None))
}
}

最后我喂 Iteratee:

ideasEnumerator(processIdeas)

现在我卡住了。我看到的每个示例都会在 foreach 中执行一些 println,但似乎并不关心最终结果。

因此,当所有文档都返回并转换后,我如何获得序列、列表或其他一些我可以进一步处理的数据类型?

最佳答案

将 Iteratee 的签名从 Iteratee[Idea, Unit] 更改为 Iteratee[Idea, Seq[A]],其中 A 是类型。基本上 Iteratee 的第一个参数是输入类型,第二个参数是输出类型。在您的情况下,您将输出类型指定为单位。

看看下面的代码。它可能无法编译,但它为您提供了基本用法。

ideasEnumerator.run(
Iteratee.fold(List.empty[MyObject]) { (accumulator, next) =>
accumulator + resolveCrossLinks(next) flatMap { next =>
addMetaInfo(next.copy(history = None))
}
}
) // returns Future[List[MyObject]]

如您所见,Iteratee 只是一个状态机。只需提取 Iteratee 部分并将其分配给一个 val:

val iteratee = Iteratee.fold(List.empty[MyObject]) { (accumulator, next) => 
accumulator + resolveCrossLinks(next) flatMap { next =>
addMetaInfo(next.copy(history = None))
}
}

在任何需要将 Idea 转换为 List[MyObject] 的地方都可以随意使用它

关于scala - 如何从 Enumerator/Iteratee 获取结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659702/

24 4 0