映射列表的Scala未来

tho*_*att 3 scala future

我有一份期货清单,我想逐一改造:

def foo(x: A): Future[B] = {...}
def mapFutures(xs: Future[List[A]]): Future[List[B]]
Run Code Online (Sandbox Code Playgroud)

该函数mapFutures应该使用转换列表的每个元素foo,并返回列表的未来.最好的方法是什么?

cmb*_*ter 7

你应该能够做你想做的事情(注意我将类型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)