Scala:期货和清单
scala: futures and lists
我有这样的方法
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,一些猫的理解方法。没有结果。
如果我们有一个 Job 我们只需要调用 jobTasks
然后 map
那个 future 就可以得到一个 JobWithTasks.
如果我们有一个 List of Jobs,我们可以使用 traverse
将前面的过程应用到每个 Job 和 return 单个 Future of List of JobWithTasks.
最后,如果我们有 Future of List of Jobs,我们需要使用 flatMap
应用前面的过程来获得单个 Future of List of JobWithTasks.
因此,代码如下所示:
def jobsWithTaks: Future[List[JobWithTasks]] =
jobs.flatMap { listOfJobs =>
Future.traverse(listOfJobs) { job =>
jobTasks(jobId = job.id).map { listOfTasks =>
JobWithTasks(job, listOfTasks)
}
}
}
这是一个名为 type tetris 的过程,它对 Scala 等表达性和函数式语言非常有用。
我有这样的方法
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,一些猫的理解方法。没有结果。
如果我们有一个 Job 我们只需要调用 jobTasks
然后 map
那个 future 就可以得到一个 JobWithTasks.
如果我们有一个 List of Jobs,我们可以使用 traverse
将前面的过程应用到每个 Job 和 return 单个 Future of List of JobWithTasks.
最后,如果我们有 Future of List of Jobs,我们需要使用 flatMap
应用前面的过程来获得单个 Future of List of JobWithTasks.
因此,代码如下所示:
def jobsWithTaks: Future[List[JobWithTasks]] =
jobs.flatMap { listOfJobs =>
Future.traverse(listOfJobs) { job =>
jobTasks(jobId = job.id).map { listOfTasks =>
JobWithTasks(job, listOfTasks)
}
}
}
这是一个名为 type tetris 的过程,它对 Scala 等表达性和函数式语言非常有用。