gpt4 book ai didi

scala futures 顺序惰性执行

转载 作者:行者123 更新时间:2023-12-01 13:43:22 27 4
gpt4 key购买 nike

我有一个 iterable 的 future ,每个都返回一个序列:Iterable[Future[Seq[Int]]] 因此,我需要一个序列是从 future 返回的序列的串联:Seq[Int]

问题是我只需要结果序列的前 n 个元素,所以我并不总是需要执行所有的 futures。我也事先不知道需要执行多少个 future 来实现它(也许第一个会返回足够的,也许我们必须执行所有)。

显然,我需要按顺序执行我的功能。我可以做 foreach 和 break/return,但我想用函数式风格来表达它。

最佳答案

以下似乎有效并且“看起来”很实用。我对这将如何实际执行或在幕后如何行动知之甚少。

这可以很容易地插入到 def 中,其中硬编码的 4 被传递给一个参数。

我想我应该返回 5 个元素,即使只请求了 4 个元素,因为对中期 future 的评估需要以任何一种方式进行。删除多余的元素应该很简单。

val f = Iterable(Future(Seq(1,2,3)), Future(Seq(4,5)), Future(Seq(6,7,8)))

val output = f.foldLeft(Future(Seq.empty[Int])){(previous, next) =>
previous.flatMap{pSeq =>
if(pSeq.length >= 4) {
Future(pSeq)
} else {
next.map(nSeq => pSeq ++ nSeq)
}
}
}

println(Await.result(output, Duration.Inf)) //List(1,2,3,4,5)

我不喜欢的一点是将 pSeq 包装在 Future 中只是为了保持一致的类型。

编辑:只是对 viktor 的回答的回应(我无法发表评论,因为没有足够高的代表,它稍微增加了我的回答的值(value))。

尽管 Viktor 的回答更容易阅读,但它必须等待所有 Futures 完成,即使它们不是必需的。

例如,将我的 f 替换为以下内容:

val f = Iterable(Future(Seq(1,2,3)), Future(Seq(4,5)), Future(throw new Exception))

它仍然有效,Viktor 调用 Future.sequence 将 Iterable[Future[]] 转换为 Future[Iterable[]],因此必须完成所有操作。

关于scala futures 顺序惰性执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962869/

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