【问题标题】:scala: futures and listsscala:期货和列表
【发布时间】:2021-03-02 20:10:22
【问题描述】:

我有这样的方法

def jobs: Future[List[Job]]
def jobTasks(jobId: Int): Future[List[Task]]

对象 Job 具有 jobId 字段。

我需要收集所有任务的所有工作,这些工作与List[JobWithTasks]的工作相匹配

case class JobWithTasks(job: Job, tasks: List[Task])

尝试过 Future.traverse,其中的一些猫方法用于理解。没有结果。

【问题讨论】:

  • 我不清楚你想做什么。你能提供一个示例输入和输出吗?
  • @mfirry 感谢您的帮助。 Luis Miguel Mejía Suárez 已经概括了我的想法。我用 parTraverse 重写了他的解决方案。一切都是好的。代码很简单,奇怪的是我昨天卡住了。

标签: list scala future for-comprehension


【解决方案1】:

如果我们有一个Job,我们只需要调用jobTasks 然后map 那未来就可以获得一个JobWithTasks。

如果我们有一个 Jobs 的 List,我们可以使用 traverse 将前面的流程应用到每个 Job 并返回一个JobWithTasks的List中的单个Future。

最后,如果我们有 Jobs 的 List 的 Future,我们需要使用 flatMap 将前面的过程应用到获取 JobWithTasks 的 List 的单个 Future。

所以,代码如下所示:

def jobsWithTaks: Future[List[JobWithTasks]] =
  jobs.flatMap { listOfJobs =>
    Future.traverse(listOfJobs) { job =>
      jobTasks(jobId = job.id).map { listOfTasks =>
        JobWithTasks(job, listOfTasks)
      }
    }
  }

这是一个名为type tetris 的过程,对于像 Scala 这样的表达性和函数式语言非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2013-04-27
    • 2015-07-22
    • 1970-01-01
    • 2015-06-03
    • 2014-12-30
    • 2020-06-12
    相关资源
    最近更新 更多