我有一份期货清单,我想逐一改造:
def foo(x: A): Future[B] = {...}
def mapFutures(xs: Future[List[A]]): Future[List[B]]
Run Code Online (Sandbox Code Playgroud)
该函数mapFutures应该使用转换列表的每个元素foo,并返回列表的未来.最好的方法是什么?
你应该能够做你想做的事情(注意我将类型A和B指定为Int和String以使事情更容易理解):
def foo(x: Int): String = x.toString
def mapFutures(xs: Future[List[Int]]): Future[List[String]] = {
for(list <- xs) yield list map foo
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你想要更通用的东西,那么你可以这样定义mapFutures:
def mapFutures[A,B](xs: Future[List[A]], f:A => B): Future[List[B]] = {
for(list <- xs) yield list map f
}
Run Code Online (Sandbox Code Playgroud)
然后它可以像这样使用:
val futs = Future(List(1,2,3))
val mappedFuts = mapFutures(futs, foo)
Run Code Online (Sandbox Code Playgroud)
编辑
现在,如果foo返回a Future,你可以做这样的事情:
def foo(x: Int): Future[String] = Future(x.toString)
def mapFutures[A,B](xs: Future[List[A]], f:A => Future[B]): Future[List[B]] = {
for{
list <- xs
mapped <- Future.sequence(list map f)
} yield mapped
}
Run Code Online (Sandbox Code Playgroud)