给定一个返回 Future
的方法像这样...
def myMethod(name: String, count: Int, default: Boolean): Future[Unit] = {
...
}
...我需要调用它 N 次,所以我定义了一个包含要传递的参数的元组列表:
val paramList = List(
("text1", 22, true),
("text2", 55, true),
("text3", 77, false)
)
我如何调用
myMethod
与 Future.traverse
?Future.traverse(paramList)(myMethod _).tupled(/* how do I pass the current tuple here? */)
最佳答案
两种可能的方法:
val futuresFromSequence: Future[List[Unit]] = Future.sequence(paramList.map {
case (a,b,c) => myMethod(a,b,c)
})
val futuresFromTraverse: Future[List[Unit]] = Future.traverse(paramList)(x => x match {
case(a,b,c) => myMethod(a,b,c)
})
请注意
traverse
将一些集合和一个函数从该集合的一个项目带到 future ,sequence
取而代之的是获取一个 future 列表并将其折叠为列表的 future 。如果您想坚持使用
tupled
语法(我个人不喜欢):Future.traverse(paramList)(x => (myMethod _).tupled(x))
如评论中所述,您可能希望串行运行它们(尽管问题并非 100% 明确),在这种情况下,您可以使用
foldLeft
和 flatMap
链接 future 的执行:myList.foldLeft(Future(List.empty[Unit]))((prevFuture, currentTuple) => {
for {
prev <- prevFuture
curr <- (myMethod _).tupled(currentTuple)
} yield prev :+ curr
})
基本上第一个生成器在启动新生成器之前等待累加器中的 future 完成,这也会返回
Future[List[Unit]]
.
关于scala - 依次执行 Scala Futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878981/