【问题标题】:How do I flatten an Array[Future[Seq[T]]]如何展平 Array[Future[Seq[T]]]
【发布时间】:2016-12-30 23:35:54
【问题描述】:

我现在搜索了 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]]

【问题讨论】:

  • Users.search 返回什么? users 变量是干什么用的?
  • 你的问题是你最终得到Seq[Future[Seq[User]]]而不是Future[Seq[User]]吗?
  • 如果您希望人们帮助您,您必须更仔细地(也许更笼统地)描述您的问题。
  • 或许将query : String的输入改为users: List[User]会更好。如果用户为query 参数输入"foobarbippy no users here!" 会发生什么?

标签: scala playframework


【解决方案1】:

为了扁平化Array[Future[Seq[User]],我们可以先用Future.sequence得到Future[Array[Seq[User]],然后再扁平化得到Future[Seq[User]]

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

【讨论】:

    【解决方案2】:

    我不喜欢我的回答中的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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多