将列表[任务[列表[A]]]转换为任务[列表[A]]

Convert List[Task[List[A]]] to Task[List[A]]

如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]

我有一个方法 returns Task[List[Header]] 并多次调用 dor 它变成 List[Task[List[Header]]]

您可以使用 Task.sequence,然后将 flatten 映射到列表的结果列表中,例如:

val res: List[Task[List[Header]]] = ...
Task.sequence(res).map(_.flatten)

如果您需要对结果进行并行执行,可以查看 Task.gather

函数 flatSequence 涵盖了该用例:https://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Traverse.scala#L86

如您所见,它将 F[G[F[A]] 转换为 G[F[A]]。现在将 F 替换为 List,将 G 替换为 Task,您就得到了所需的内容。这将适用于具有 TraverseFlatMap 实例的任何 F 以及具有 Applicative 实例的任何 G

如果您想 运行 并行执行任务,您可以使用此处的 parFlatSequencehttps://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Parallel.scala#L155