【问题标题】:Scala: How to deal with sequences in a Future for comprehensionScala:如何在未来处理序列以进行理解
【发布时间】:2015-06-18 08:54:48
【问题描述】:

鉴于以下返回Future的方法...

def getProducts: Future[List[Product]] = { ... }
def sendOrder(p: Product, n: Int): Future[Order] = { ... }

...我需要为getProducts 返回的每个产品调用sendOrder,最后yield 处理的产品数量:

for {
  products <- getProducts
  // how do I iterate thru products and invoke sendOrder for each element?
  ...
} yield products.length

上面for理解中的商品列表如何处理?

编辑

事情变得更加复杂,因为我需要在sendOrder 之前调用第三个方法,当且仅当getProducts 实际上返回一个非空列表:

def doSomethingBeforeSendingOrder: Future[String] = { ... }

for {
  p <- getProducts
  // how do I invoke doSomethingBeforeSendingOrder before sendOrder and
  // only if getProducts actually returns a nonEmptylist?
  o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans)))
} yield o.length

【问题讨论】:

    标签: scala future for-comprehension


    【解决方案1】:

    我不知道 sendOrder 的第二个参数应该来自哪里,但基本上你想做类似的事情:

    for {
      p <- getProducts
      if p.nonEmpty
      _ <- someOtherMethodThatReturnsAFuture
      o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans)))
    } yield o.length
    

    Future.sequence 会将您的 List[Future[Order]] 变成 Future[List[Order]]

    【讨论】:

    • 第二个参数只是要发送的项目数......但这里只是一个细节;-) 现在的问题是我如何调用另一个方法 before @ 987654322@ 并且仅当getProducts 实际返回一个非空列表(请参阅我更新的帖子)?
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2020-06-28
    相关资源
    最近更新 更多