【问题标题】:How to get Future[Seq[Person]] instead of Seq[Future[Person]]如何获取 Future[Seq[Person]] 而不是 Seq[Future[Person]]
【发布时间】:2019-01-07 10:20:05
【问题描述】:

我有两个外部调用

  1. 这给出了 Future[Seq[People]]
  2. 接受 person_id 并返回 person_status 作为 Future[String]

我需要使用第一次通话中可用序列中的第二次通话来更新每个人的状态。我就是这样尝试的,

getFuturePeople.map( (seqPeople : Seq[People]) => {
     seqPeople.map(person => getStatus(person._id).status).map(status => {
     //Update status for this person but I get Seq[Future[Peoson]]
   }) 
})

【问题讨论】:

  • @Jasper-M 该问题询问如何获得List[A],而不是Future[List[A]]。答案恰好相似是无关紧要的。
  • @BrianMcCutchon 我不完全同意这些问题不符合重复的条件,但可以肯定的是,请选择其他无数问题之一,要求sequence...

标签: scala future


【解决方案1】:

您需要以Future.traverse 的身份遍历List

例子,

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

def getFuturePeople = Future { List("Steven", "Wilson", "Michael") }
def getStatus(name: String) = Future { s"$name updated" }

现在,就像您尝试的那样,您会收到Future[List[Future[String]]]

getFuturePeople.map { people => people.map { p => getStatus(p) } }

1) 所以,不要仅仅映射list of people,而是做Future.traverse

val updatedPeople: Future[List[String]] = getFuturePeople.flatMap { people =>
       Future.traverse(people) { p =>
         getStatus(p)
       }
 }

2) 同样有效的是,一旦您映射到list of people 并获得List[Future[A]],使用Future.sequence 转换为Future[List[A]]

val updatedPeopleUsingSeq: Future[List[String]] = getFuturePeople.flatMap { people =>
       Future.sequence {
         people.map(getStatus)
       }
}

【讨论】:

  • 这有正确的信息,但它太冗长以至于很难看到它,我几乎没有费心去阅读它。 REPL 输出很难阅读,你不需要像这样展示你的工作,你可以通过几行解释来展示解决方案。
  • 最好尽可能使用与原始问题相同的类型和名称。 (例如Seq 而不是ListgetFuturePeople 而不是getPeople
【解决方案2】:

像这样使用 Future.sequence:

val returnedFuture :Seq[Future[People]] = Seq(Future.successful(People))

val flattenedFuture:Future[Seq[Peope]] = Future.sequence(returnedFuture)

【讨论】:

    【解决方案3】:

    使用可以使用Future.sequence转换结果,例如:

    val futureOfSeq = Future.sequence(seqOfFuture)

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2019-12-13
      • 1970-01-01
      • 2018-04-04
      • 2017-11-19
      • 2018-02-17
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多