如何展平数组[Future [Seq [T]]]

时间:2016-12-28 13:32:27

标签: scala playframework

我现在正在搜索2小时,但没有得到任何问题的答案。我想只有一个Seq返回但是有一个Seq数组,所以现在我的问题是如何从数组中提取seq

def searchUsers(query: String): Future[Seq[User]] = {
  var queryStrings: Array[String] = query.split(" ")
  var users = ArrayBuffer[User]()
  queryStrings.map(Users.search(_))
}

也许有人可以帮助我

干杯

更新

抱歉,我的问题并非如此。 我的问题是我希望返回值为Future [Seq [User]],并且由于query.split(我必须映射它),它是Array [Future [Seq [User]]]

错误是 类型Array [Future [Seq [User]]]的表达式不符合预期类型Future [Seq [User]]

2 个答案:

答案 0 :(得分:4)

为了展平Array[Future[Seq[User]],我们可以先使用Future.sequence获取Future[Array[Seq[User]],然后展平它以获得Future[Seq[User]]

Future
 .sequence[Seq[User], Seq](queryStrings.map(Users.search))
 .map(_.flatten)

答案 1 :(得分:0)

我不喜欢我的答案中的x.toList,但发布以显示Future#traverse的用法:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

def f[A, B](x: Array[A], f: A => Future[Seq[B]]): Future[Seq[B]] = 
  Future.traverse[A, Seq[B], Seq](x.toList)(f).map(_.flatten)

scala> f( Array(1,2,3), { x: Int => Future.successful(List(x)) } )
res2: scala.concurrent.Future[Seq[Int]] = Success(List(1, 2, 3))