给定一个返回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? */)
答案 0 :(得分:10)
两种可能的方法:
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
从该集合的项目中获取一些集合和函数到未来,sequence
取一个未来列表并将其折叠到列表的未来。
如果你想坚持使用tupled
语法(我个人不喜欢):
Future.traverse(paramList)(x => (myMethod _).tupled(x))
如评论中所述,您可能希望以串行方式运行它们(尽管问题并非100%明确),在这种情况下,您可以使用foldLeft
和flatMap
来链接将来的执行:
myList.foldLeft(Future(List.empty[Unit]))((prevFuture, currentTuple) => {
for {
prev <- prevFuture
curr <- (myMethod _).tupled(currentTuple)
} yield prev :+ curr
})
基本上第一个生成器在启动累加器之前等待将来完成,这也会返回Future[List[Unit]]
。