从另一个序列生成新的 Scala 序列

Generate new scala sequence from another sequence

我有一个 ID 序列和一个函数,其中 return 每个 ID 都有一个 Option[workItem]。我想要做的就是从这两件事中生成一系列 workItem。我尝试了地图、foreach 和 for comprehension 的各种组合,但没有任何效果。

def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = {
   ids.map {
        id: workItemId => id.map(getWorkItem(_)
  }
}

这给我错误 - Seq[Option[WorkItem] 类型的表达式不符合预期类型 _B

我试过 foreach -

def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = {
   ids.map {_.foreach(getWorkItem(_)}      
}

这给我错误 - 类型 Unit 的表达式不符合预期类型 _B

我不确定这个 _B 类型是什么以及我该如何进行这种转换。

几乎可以像您预期的那样工作。

trait o {

  class Id  {}
  class WorkItem { }

  def getWorkItem(id: Id): Option[WorkItem]

  def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = {
    val res = ids.map { idsSeq =>
      idsSeq.map { id =>
        getWorkItem(id)
      }
    }
    res
  }



}

但对我来说 getWorkItems 应该 return Future[Seq[WorkItem]] 而不是内部 map 你可以使用 flatMap

  def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[WorkItem]] = {
    val res = ids.map { idsSeq =>
      idsSeq.flatMap { id =>
        getWorkItem(id)
      }
    }
    res
  }