如何在 scala 中将List[Task[List[Header]]]类型转换为 Task[List[Header]] 。
我有一个方法返回 Task[List[Header]] 并多次调用 dor 它变成 List[Task[List[Header]]]
如何在 scala 中将List[Task[List[Header]]]类型转换为 Task[List[Header]] 。
我有一个方法返回 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
如您所见,它需要 aF[G[F[A]]
并将其转换为G[F[A]]
. 现在F
用List
和G
替换Task
,你就得到了你需要的东西。这将适用于任何F
带有Traverse
和FlatMap
实例的任何东西以及任何G
带有Applicative
实例的东西。
如果你想并行运行任务,你可以parFlatSequence
在这里找到:https ://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Parallel.scala#L155