【问题标题】:Combine Scala Future[Seq[X]] with Seq[Future[Y]] to produce Future[(X,Seq[Y])]将 Scala Future[Seq[X]] 与 Seq[Future[Y]] 组合生成 Future[(X,Seq[Y])]
【发布时间】:2019-12-13 03:35:04
【问题描述】:

我的实体类中有以下关系, customer -> * Invoice 现在我必须实现一个方法,用他们的发票返回客户

type CustomerWithInvoices = (Custimer,Seq[Invoice])

  def findCustomerWitnInvoices:Future[Seq[CustomerWithInvoices]] = {
    for{
      customers <- findCustomers
      eventualInvoices: Seq[Future[Seq[Invoice]]] = customers.map(customer => findInvoicesByCustomer(customer))

    } yield ???
  }

使用现有的存储库方法如下

def findCustomers:Future[Seq[Customers]] = {...}

def findInvoicesByCustomer(customer:Customer):Future[Seq[Invoice]] = {...}

我尝试使用上述for 表达式,但我无法找到正确的方法,因为我对 Scala 还很陌生,非常感谢任何帮助..

【问题讨论】:

  • 您无法将其映射到Future[(Customer, Seq[Invoice])],因为每个客户有多个客户和多个发票。您可能想要Future[Seq[(Customer, Seq[Invoice])]](或带有别名的Future[Seq[CustomerWithInvoices]])。
  • 抱歉我的错误@marstran 你是对的,我打错了签名
  • 我认为你需要在for-comp的第二行有一个箭头,否则你会堆叠期货并最终得到可怕的类型Future[Future[Blabla]]
  • 也许:findCustomers.flatMap { customers =&gt; Future.traverse(customers)(customer =&gt; findInvoicesByCustomer(customer).map(invoices =&gt; (customer -&gt; invoices)) ) }。 - 当你混合两种不同的类型时,理解并不是很好。
  • @LuisMiguelMejíaSuárez 正是我想要的,谢谢

标签: scala future


【解决方案1】:

我会使用Future.sequence,简化的方法签名是 sequence takes M[Future[A]] and returns Future[M[A]] 这就是我们需要解决您的问题,这是我要编写的代码:

val eventualCustomersWithInvoices: Future[Seq[(Customer, Seq[Invoice])]] = for {
      customers <- findCustomers()
      eventualInvoices <- Future.sequence(customers.map(customer => findInvoicesByCustomer(customer)))

    } yield eventualInvoices

注意eventualInvoices 的类型是Future[Seq[(Customer, Seq[Invoice])]] 因此Future[Seq[CustomerWithInvoices]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多