将列表[任务[列表[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
,您就得到了所需的内容。这将适用于具有 Traverse
和 FlatMap
实例的任何 F
以及具有 Applicative
实例的任何 G
。
如果您想 运行 并行执行任务,您可以使用此处的 parFlatSequence
:https://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Parallel.scala#L155
如何在 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
,您就得到了所需的内容。这将适用于具有 Traverse
和 FlatMap
实例的任何 F
以及具有 Applicative
实例的任何 G
。
如果您想 运行 并行执行任务,您可以使用此处的 parFlatSequence
:https://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Parallel.scala#L155